Cos’è Laravel Dusk
Laravel Dusk è uno strumento di test E2E che opera realmente sul browser per verificare l’intera schermata.
Per impostazione predefinita, puoi eseguire i test con ChromeDriver senza dover preparare a parte un server Selenium.
Nella documentazione ufficiale, per i nuovi progetti sono consigliati anche i browser test di Pest 4. Usa questa pagina se stai usando Dusk in un progetto esistente o se vuoi utilizzare l’API di Dusk.
Installazione
Per prima cosa installa Google Chrome e aggiungi Dusk come dipendenza di sviluppo.
composer require laravel/dusk --dev
php artisan dusk:install
Se vuoi allineare la versione di ChromeDriver usa il comando dusk:chrome-driver.
# Rileva e installa la versione compatibile con il Chrome locale
php artisan dusk:chrome-driver --detect
Configurazione dell’ambiente (.env.dusk.local)
Per usare variabili d’ambiente dedicate a Dusk, crea .env.dusk.{environment} nella root del progetto.
Per l’ambiente locale usa .env.dusk.local.
APP_URL =http://127.0.0.1:8000
DB_CONNECTION =mysql
DB_DATABASE =app_testing
DB_USERNAME =root
DB_PASSWORD =root
Durante l’esecuzione di Dusk .env viene salvato come backup e il contenuto di .env.dusk.local viene applicato temporaneamente.
Test di base del browser
Genera un test ed eseguilo con php artisan dusk.
php artisan dusk:make LoginTest
php artisan dusk
Per rieseguire solo i test falliti:
Esempio di operazioni di base
<? php
namespace Tests\Browser ;
use App\Models\ User ;
use Laravel\Dusk\ Browser ;
use Tests\ DuskTestCase ;
class LoginTest extends DuskTestCase
{
public function test_user_can_login () : void
{
$user = User :: factory () -> create ([
'email' => '[email protected] ' ,
]);
$this -> browse ( function ( Browser $browser ) use ( $user ) {
$browser -> visit ( '/login' )
-> type ( 'email' , $user -> email )
-> type ( 'password' , 'password' )
-> press ( 'Login' )
-> assertPathIs ( '/dashboard' )
-> assertSee ( 'Dashboard' );
});
}
}
visit(), type(), press() e assertSee() sono le operazioni più usate in Dusk.
Nei test Dusk non si usa RefreshDatabase. Come indica la documentazione ufficiale, inizializza i dati tra i test con DatabaseMigrations o DatabaseTruncation.
Pattern Page Object
Quando testi schermate complesse, creare un page object con dusk:page facilita la manutenzione.
php artisan dusk:page Login
In tests/Browser/Pages/Login.php definisci url() ed elements() e riutilizzali lato test.
use Tests\Browser\Pages\ Login ;
$browser -> visit ( new Login )
-> type ( '@email' , '[email protected] ' )
-> type ( '@password' , 'password' )
-> click ( '@submit' )
-> assertSee ( 'Dashboard' );
Screenshot e debug
Per indagare i fallimenti è utile salvare screenshot e log della console.
$browser -> screenshot ( 'login-failed' );
$browser -> responsiveScreenshots ( 'login-page' );
$browser -> screenshotElement ( '#login-form' , 'login-form' );
$browser -> storeConsoleLog ( 'login-console' );
Screenshot: tests/Browser/screenshots
Log della console: tests/Browser/console
Esecuzione in CI (GitHub Actions)
In GitHub Actions avvia ChromeDriver e il server incluso di Laravel e poi esegui php artisan dusk.
name : Dusk tests
on : [ push , pull_request ]
jobs :
dusk :
runs-on : ubuntu-latest
env :
APP_URL : http://127.0.0.1:8000
DB_USERNAME : root
DB_PASSWORD : root
MAIL_MAILER : log
steps :
- uses : actions/checkout@v5
- run : cp .env.example .env
- run : composer install --no-progress --prefer-dist --optimize-autoloader
- run : php artisan key:generate
- run : php artisan dusk:chrome-driver --detect
- run : ./vendor/laravel/dusk/bin/chromedriver-linux --port=9515 &
- run : php artisan serve --no-reload &
- run : php artisan dusk
Flusso di esecuzione di Dusk
Documentazione ufficiale
Laravel Dusk — Documentazione ufficiale Consulta la documentazione ufficiale per tutte le API di Dusk (attese, asserzioni, operazioni da tastiera, operazioni su iframe, ecc.).