Automatiska test med Laravel Dusk och Travis CI

Samtidigt som Laravel 5.4 släpptes nyligen publicerades också Laravel Dusk, ett nytt paket som låter dig skriva test som körs i webbläsaren. Även om detta kunde lösas redan tidigare med hjälp av verktyg som Selenium vill man med Dusk göra det enklare att konfigurera och komma igång att skriva tester bland annat genom att testerna skrivs direkt i PHP.

Jag väntade på att 5.4 skulle släppas för en ny applikation som jag tror skulle kunna dra nytta av den typ av frontendtest som Dusk förenklar. Därför började jag tidigt både att skriva tester och att se hur de kunde integreras i mitt arbetsflöde, till exempel genom automatisk körning av testerna.

Som med alla nya paket är antalet artiklar och källor fortfarande ganska begränsat men Laravel Dusk Automation av Erik Smith beskriver utförligt stegen han gick igenom för att få Dusk att köras automatiskt på CodeShip. Med detta som utgångspunkt och inspiration började jag försöka få det att fungera med Travis.

Travis CI

Travis är en tjänst för continuous integration som låter dig automatiskt köra tester och builds när du pushar din kod till GitHub eller när någon skickar en pull request till ditt repository.

Den tighta integrationen med GitHub och det faktum att det är gratis för open source-projekt gör det till ett bra verktyg för att se till att dina tester körs.

Michael Calkins har skrivit en kort men utförlig guide på Sitepoint som hjälper dig att komma igång och sätta upp dina projekt på Travis.

Lägga till Dusk i ditt projekt

Laravels dokumentation om Dusk är precis så bra och tydlig som vi har kommit att förvänta oss från Taylor så följ stegen under ”Browser Tests” för att installera och konfigurera Dusk i projektet.

Med version 1.0.5 av Dusk, tack vare en pull request från Raphaël Huchet, returneras numera korrekta exit codes från PHPUnit så att tjänster som Travis kan indikera om testerna lyckades eller om några fel uppstod. Så du vill använda minst den versionen eller senare.

När du installerat Dusk skulle jag också rekommendera att läsa Matt Stauffers inlägg om Dusk och hur man kommer igång att skriva tester med det. Precis som alla inlägg från Matt är det väl värt att läsa igenom.

Byt webbläsare till PhantomJS

Dusk använder sig som standard av Chrome som webbläsare men det är en relativt enkel process att byta och använda sig av någon annan webbläsare som stödjer Remote WebDriver.

Travis har Firefox och PhantomJS förinstallerade och jag gjorde några försök att installera Chrome och konfigurera miljön att köra det automatiskt men bestämde mig så småningom att gå den lättaste vägen och utnyttja PhantomJS.

Eftersom testerna kommer att köras i PhantomJS istället för Chrome måste vi göra några mindre ändringar i filen tests/DuskTestCase.php:

public static function prepare()
{
 //static::startChromeDriver();
}

...

protected function driver()
{
 return RemoteWebDriver::create(
 'http://localhost:9515', DesiredCapabilities::phantomjs()
 );
}

Vi byter helt enkelt ut chrome() mot phantomjs() i driver-metoden så att vår WebDriver ansluter till PhantomJS när testen körs. Eftersom Chrome då inte längre behöver köras alls kan vi kommentera bort anropet till startChromeDriver i prepare metoden.

Konfigurera Travis

Travis konfigureras genom filen .travis.yml som placeras i applikationens rotkatalog. Denna beskriver vilken miljö som ska användas och hur testerna ska köras. Skapa filen med följande innehåll:

language: php

php:
 - 7.0

install:
 - travis_retry composer install --no-interaction --prefer-dist --no-suggest
 - cp .env.example .env # Create a new .env file
 - php artisan key:generate # Generate application key

before_script:
 - phantomjs --webdriver=127.0.0.1:9515 & # Start PhantomJS driver
 - php artisan serve & # Start server
 - sleep 5 # Give PhantomJS and Artisan time to start

script: php artisan dusk

Travis kommer att använda Composer för att installera applikationen och alla dependencies, skapa filen .env utifrån exempelfilen ditt repository och därefter fylla i APP_KEY genom att generera den med hjälp av Artisan.

När installationen är slutförd startas PhantomJS i Remote WebDriver-läge och en PHP-server att köra testerna emot startas. Det ligger också en kort fördröjning efter dessa steg för att försäkra sig om att båda processerna hinner starta ordentligt innan testerna körs.

Slutligen anropas Dusk som vanligt genom Artisan.

Avslutning

Det finns, som alltid, utrymme för förbättring men detta kommer i alla fall låta dig komma igång med automatiska tester med Travis. Jag har publicerat en demoapplikation på GitHub och dess builds på Travis är publika.

Man skulle kunna vilja se att webbläsaren byttes ut vid körning beroende på vilken miljö Dusk körs i och därmed köra Chrome lokalt och PhantomJS på Travis. Man kanske till och med vill fortsätta där jag gav upp och försöka få Travis att ladda ner och installera Chrome och därmed kunna utesluta PhantomJS helt.

Bidra gärna med tankar och idéer om hur det kan förbättras vidare.

Publicerad:

Kommentera

E-postadressen publiceras inte. Obligatoriska fält är märkta *