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.
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.
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.
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 migreraLå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 somPosta
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 undertest / enhet
katalog.$ php hantverkare: test AccessorTest - enhetOch 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 hosgetNameAttribute
metod förPosta
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örgetNameAttribute
metod för att förbereda posttiteln. Slutligen använder viassertEquals
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 undertest / Funktion
katalog.$ php hantverkare: test AccessorTestDet 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 medassertSeeText
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.
$ PHPUnitDet 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!