Laravel Dusk управляет настоящим браузером Chrome. Он нужен, когда feature-тест не покрывает поведение: JavaScript, компоненты Livewire или Alpine, модальные окна, drag and drop.

Установка

bash
composer require laravel/dusk --dev
php artisan dusk:install
php artisan dusk

dusk:install создаёт tests/Browser и tests/DuskTestCase.php. Заведите отдельный .env.dusk.local со своей базой и APP_URL: Dusk подменяет им окружение на время тестов.

Как работает Dusk
Как работает Dusk

💡 php artisan dusk --filter=LoginTest запускает один класс, а php artisan dusk:fails перезапускает только упавшие тесты.

Первый тест

php
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"].

php
// <button dusk="save-button" class="btn btn-primary">Save</button>

$browser->click('@save-button')
    ->assertSeeIn('@toast', 'Saved');