Testning i Laravel

Oavsett vilken applikation du har att göra med är testning en viktig och ofta förbisedd aspekt som du bör uppmärksamma den uppmärksamhet som den förtjänar. Idag kommer vi att diskutera det i samband med Laravel webs ramverk.

I själva verket stöder Laravel redan PHPUnit-testramverket i själva kärnan. PHPUnit är en av de mest populära och allmänt accepterade testramarna över PHP-gemenskapen. Det låter dig skapa båda typer av testenheter och funktionella.

Vi börjar med en grundläggande introduktion till enhets- och funktionstestning. När vi fortsätter ska vi undersöka hur man skapar enhets- och funktionstester i Laravel. Jag antar att du är bekant med grunderna i PHPUnit-ramen eftersom vi kommer att undersöka det i Larviks sammanhang i den här artikeln.

Enhet och funktionstester

Om du redan är bekant med PHPUnit-ramen bör du veta att du kan dela in tester i två smaker-enhetstester och funktionstester.

I enhetsprov testar du korrektheten hos en given funktion eller en metod. Viktigare är att du testar en enda del av kodens logik vid en given tidpunkt.

Om du tycker att metoden du har implementerat innehåller mer än en logisk enhet, är det bättre att dela upp det i flera metoder så att varje metod innehåller en enda logisk och testbar kod.

Låt oss ta en snabb titt på ett exempel som är ett idealfall för enhetsprovning.

offentlig funktion getNameAttribute ($ value) return ucfirst ($ value); 

Som du kan se, gör metoden en och en sak. Den använder ucfirst funktion för att konvertera en titel till en titel som börjar med stor bokstav.

Enhetsprovet används för att testa korrektheten hos en enda logisk kodenhet, men det funktionella testet gör det möjligt att testa korrektheten hos ett specifikt användningsfall. Mer specifikt kan du simulera åtgärder som en användare utför i en applikation för att driva ett specifikt användningsfall.

Till exempel kan du implementera ett funktionellt testfall för vissa inloggningsfunktioner som kan innebära följande steg.

  • Skapa GET-förfrågan för att komma åt inloggningssidan.
  • Kolla om vi är på inloggningssidan.
  • Generera POST-förfrågan för att skicka data till inloggningssidan.
  • Kontrollera om sessionen skapades framgångsrikt.

Så så ska du skapa det funktionella testfallet. Från nästa avsnitt framåt skapar vi exempel som visar hur man skapar enhetliga och funktionella testfall i Laravel.

Ställa in förutsättningarna

Innan vi fortsätter och skapar verkliga tester måste vi ställa in ett par saker som ska användas i våra test.

Vi kommer att skapa Post-modellen och relaterad migrering till att börja med. Fortsätt och kör följande artisan kommando för att skapa Posta modell.

$ php artisan make: modell Post - migration

Ovanstående kommando bör skapa Posta modell klass och en tillhörande databas migration också.

De Posta modellklass ska se ut som:

Och migreringsfilen för databasen ska skapas på databas / migreringar / YYYY_MM_DD_HHMMSS_create_posts_table.php.

Vi vill också lagra postens titel. Låt oss ändra koden för Posta databas migreringsfil att se ut som följande.

inkrement ( 'id'); $ Bords> string ( 'namn'); $ Tabell-> tidsstämplar (); );  / ** * Omvandla migrationerna. * * @return void * / public function down () Schema :: dropIfExists ('posts'); 

Som du kan se har vi lagt till $ Bords> string (namn) kolumn för att lagra postens titel. Därefter behöver du bara köra migrera kommandot för att faktiskt skapa den tabellen i databasen.

$ php hantverkare migrera

Låt oss också ersätta Posta modell med följande innehåll.

Vi har just lagt till accessor metod som ändrar titeln på posten, och det är exakt vad vi ska testa i vårt testenhet. Det är så långt som Posta modellen är oroad.

Därefter skapar vi en kontrollerfil på app / HTTP / Controllers / AccessorController.php. Det kommer att vara användbart för oss när vi skapar det funktionella testfallet senare.

få ("id", 0); // ladda den begärda posten $ post = Post :: hitta ($ post_id); // kolla namnet returnera $ post-> namn; 

I index metod, hämtar vi post-idet från förfrågningsparametrarna och försöker ladda postmodellobjektet.

Låt oss också lägga till en tillhörande rutt i rutter / web.php fil.

Rutt :: få ('accessor / index', 'AccessorController @ index');

Och med det på plats kan du köra http://your-laravel-site.com/accessor/index URL för att se om det fungerar som förväntat.

Enhetstestning

I det föregående avsnittet gjorde vi den ursprungliga inställningen som kommer att vara användbar för oss i den här och kommande sektionen. I det här avsnittet kommer vi att skapa ett exempel som demonstrerar begreppen enhetstestning i Laravel.

Som alltid tillhandahåller Laravel ett artisan-kommando som låter dig skapa basmallklassen i testenheten.

Kör följande kommando för att skapa AccessorTest enhetstest fall klass. Det är viktigt att notera att vi passerar --enhet sökord som skapar testenhet för enheten och den kommer att placeras under test / enhet katalog.

$ php hantverkare: test AccessorTest - enhet

Och det borde skapa följande klass på test / Enhet / AccessorTest.php.

assertTrue (true); 

Låt oss ersätta det med en meningsfull kod.

namn); // ladda in med Eloquent $ model_post = Post :: hitta (1); $ model_post_title = $ model_post-> namn; $ this-> assertEquals ($ db_post_title, $ model_post_title); 

Som du kan se är koden exakt densamma som den skulle ha varit i kärnan PHP. Vi har just importerat Laravel-specifika beroenden som tillåter oss att använda de obligatoriska API-erna. I testAccessorTest metod, vi ska testa korrektheten hos getNameAttribute metod för Posta modell.

För att göra det har vi hämtat ett exemplarpost från databasen och förberett den förväntade produktionen i $ db_post_title variabel. Därefter laddar vi samma post med Eloquent-modellen som kör getNameAttribute metod för att förbereda posttiteln. Slutligen använder vi assertEquals Metod för att jämföra båda variablerna som vanligt.

Så det är hur man förbereder enhetsprovfall i Laravel.

Funktionstestning

I det här avsnittet skapar vi det funktionella testfallet som testar funktionaliteten hos den controller som vi skapade tidigare.

Kör följande kommando för att skapa AccessorTest funktionell test fall klass. Eftersom vi inte använder --enhet sökord, det behandlas som ett funktionellt testfall och placeras under test / Funktion katalog.

$ php hantverkare: test AccessorTest

Det kommer att skapa följande klass på test / Funktion / AccessorTest.php.

assertTrue (true); 

Låt oss ersätta det med följande kod.

namn); $ response = $ this-> get ('/ accessor / index? id = 1'); $ Responsen> assertStatus (200); $ Responsen> assertSeeText ($ db_post_title); 

Återigen bör koden se ut för de som har tidigare erfarenhet av funktionell testning.

För det första hämtar vi ett exemplarpost från databasen och förbereder den förväntade produktionen i $ db_post_title variabel. Efter det försöker vi simulera / Accessor / index? Id = 1 GET-förfrågan och ta tag i svaret på den förfrågan i $ svar variabel.

Sedan har vi försökt matcha svarskoden i $ svar variabel med den förväntade svarskoden. I vårt fall borde det vara 200 eftersom vi borde få ett giltigt svar för vår GET-förfrågan. Vidare bör svaret innehålla en titel som börjar med stor bokstav, och det är precis vad vi försöker matcha med assertSeeText metod.

Och det är ett exempel på det funktionella testfallet. Nu har vi allt vi kan köra våra tester mot. Låt oss fortsätta och springa följande kommando i roten till din ansökan för att köra alla tester.

$ PHPUnit

Det borde köra alla tester i din ansökan. Du bör se en vanlig PHPUnit-utgång som visar status för test och påståenden i din ansökan.

Och med det är vi i slutet av den här artikeln.

Slutsats

Idag undersökte vi detaljerna för testning i Laravel, som redan stödjer PHPUnit i sin kärna. Artikeln började med en grundläggande introduktion till enhets- och funktionstestning, och när vi flyttade vi undersökte specifikationerna för testning i samband med Laravel.

I processen skapade vi en handfull exempel som visade hur du kunde skapa enhetliga och funktionella testfall med hjälp av artisan-kommandot.

Om du precis börjat med Laravel eller vill utvidga din kunskap, webbplats eller ansökan med tillägg, har vi en mängd olika saker du kan studera i Envato Market.

Tveka inte att uttrycka dina tankar med hjälp av flödet nedan!