Laravel Dusk управляет настоящим браузером Chrome. Он нужен, когда feature-тест не покрывает поведение: JavaScript, компоненты Livewire или Alpine, модальные окна, drag and drop.
Установка
composer require laravel/dusk --dev
php artisan dusk:install
php artisan duskdusk:install создаёт tests/Browser и tests/DuskTestCase.php. Заведите отдельный .env.dusk.local со своей базой и APP_URL: Dusk подменяет им окружение на время тестов.
💡
php artisan dusk --filter=LoginTestзапускает один класс, аphp artisan dusk:failsперезапускает только упавшие тесты.
Первый тест
namespace Tests\Browser;
use Laravel\Dusk\Browser;
use Tests\DuskTestCase;
class LoginTest extends DuskTestCase
{
public function test_user_can_log_in(): void
{
$this->browse(function (Browser $browser) {
$browser->visit('/login')
->type('email', 'taylor@example.com')
->type('password', 'secret')
->press('Log in')
->assertPathIs('/dashboard');
});
}
}browse() открывает браузер и передаёт объект Browser. Каждый вызов возвращает тот же объект, поэтому шаги читаются как история. Когда тест падает, Dusk сохраняет скриншот в tests/Browser/screenshots, а лог консоли — в tests/Browser/console.
Селекторы
Предпочитайте атрибут dusk CSS-классам. @save-button выбирает [dusk="save-button"].
// <button dusk="save-button" class="btn btn-primary">Save</button>
$browser->click('@save-button')
->assertSeeIn('@toast', 'Saved');