Ongeacht de applicatie waar u mee te maken hebt, testen is een belangrijk en vaak over het hoofd gezien aspect dat u de aandacht moet geven die het verdient. Vandaag gaan we het bespreken in de context van het Laravel-webraamwerk.
In feite ondersteunt Laravel het PHPUnit-testraamwerk al in de kern zelf. PHPUnit is een van de meest populaire en algemeen aanvaarde testkaders in de PHP-community. Hiermee kunt u beide soorten tests-eenheid en functioneel maken.
We beginnen met een basisinleiding voor unit- en functionele testen. Naarmate we verdergaan, zullen we onderzoeken hoe we unit- en functionele tests kunnen maken in Laravel. Ik neem aan dat je bekend bent met de basisprincipes van het PHPUnit-framework, zoals we dit in de context van Laravel in dit artikel zullen onderzoeken.
Als u al bekend bent met het PHPUnit-framework, moet u weten dat u tests kunt verdelen in twee smaken: unit tests en functionele tests.
In eenheidscontroles test u de juistheid van een bepaalde functie of een methode. Wat nog belangrijker is, u test een enkel stuk van de logica van uw code op een bepaald moment.
Als u in uw ontwikkeling vindt dat de methode die u hebt geïmplementeerd meer dan één logische eenheid bevat, kunt u dat beter opsplitsen in meerdere methoden, zodat elke methode één logisch en toetsbaar stuk code bevat.
Laten we snel een voorbeeld bekijken dat een ideaal geval is voor unit-testen.
openbare functie getNameAttribute ($ value) return ucfirst ($ value);
Zoals je kunt zien, doet de methode maar één ding. Het gebruikt de ucfirst
functie om een titel om te zetten in een titel die begint met een hoofdletter.
Terwijl de eenheidstest wordt gebruikt om de juistheid van een enkele logische code-eenheid te testen, kunt u met de functietest aan de andere kant de juistheid van een specifieke use-case testen. Meer specifiek kunt u hiermee acties simuleren die een gebruiker in een toepassing uitvoert om een specifieke use-case uit te voeren.
U kunt bijvoorbeeld een functionele testcase voor enkele aanmeldingsfunctionaliteit implementeren die de volgende stappen kan omvatten.
Dus dat is hoe je de functionele testcase zou moeten maken. In de volgende sectie zullen we voorbeelden maken die laten zien hoe eenheid en functionele testgevallen in Laravel kunnen worden gemaakt.
Voordat we doorgaan en echte tests maken, moeten we een aantal dingen instellen die in onze tests zullen worden gebruikt.
We zullen het Post-model en de gerelateerde migratie creëren om mee te beginnen. Ga je gang en voer het volgende artisan-commando uit om het te maken Post
model-.
$ php artisan make: model Post --migration
Het bovenstaande commando zou het moeten maken Post
modelklasse en een bijbehorende databasemigratie.
De Post
modelklasse moet er als volgt uitzien:
En het database-migratiebestand zou moeten worden aangemaakt bij
databank / migraties / YYYY_MM_DD_HHMMSS_create_posts_table.php
.We willen ook de titel van de post opslaan. Laten we de code van de
Post
databasemigratiebestand om er als volgt uit te zien.verhogingen ( 'id'); $ Tafel-> string ( 'name'); $ Tafel-> timestamps (); ); / ** * Keer de migraties terug. * * @return void * / public function down () Schema :: dropIfExists ('berichten');Zoals u kunt zien, hebben we het
$ Tafel-> string ( 'name')
kolom om de titel van het bericht op te slaan. Vervolgens moet u de opdracht Migratie uitvoeren om die tabel daadwerkelijk in de database te maken.$ php artisan migrerenLaten we ook de
Post
model met de volgende inhoud.We hebben zojuist het
accessor
methode, die de titel van het bericht wijzigt, en dat is precies wat we zullen testen in onze eenheidstestcase. Dat is het voor zover als hetPost
model betreft.Vervolgens maken we een controllerbestand aan
app / Http / Controllers / AccessorController.php
. Het is nuttig voor ons wanneer we de functionele testcase in een later stadium maken.get ("id", 0); // laad de gevraagde post $ post = Post :: find ($ post_id); // controleer de eigenschap name return $ post-> name;In de
inhoudsopgave
methode, halen we de post-id op uit de verzoekparameters en proberen we het post-modelobject te laden.Laten we ook een bijbehorende route toevoegen in de
routes / web.php
het dossier.Route :: get ('accessor / index', 'AccessorController @ index');En met dat op zijn plaats, kunt u de http://your-laravel-site.com/accessor/index URL uitvoeren om te zien of het werkt zoals verwacht.
Testen van een eenheid
In het vorige gedeelte hebben we de eerste installatie gedaan die nuttig zal zijn voor ons in deze en de komende secties. In deze sectie gaan we een voorbeeld maken dat de concepten van unit testing in Laravel demonstreert.
Zoals altijd biedt Laravel een ambachtelijke opdracht waarmee u de basismarkerklasse van de unit-testcase kunt maken.
Voer de volgende opdracht uit om de. Te maken
AccessorTest
eenheid testklasse. Het is belangrijk op te merken dat we de--eenheid
sleutelwoord dat de eenheidstestcase creëert, en het zal onder de worden geplaatstproeven / Unit
directory.$ php artisan make: test AccessorTest - eenheidEn dat zou de volgende klasse moeten creëren
proeven / Unit / AccessorTest.php
.assertTrue (true);Laten we het vervangen door een betekenisvolle code.
naam); // laad bericht met behulp van Eloquent $ model_post = Post :: find (1); $ model_post_title = $ model_post-> naam; $ this-> assertEquals ($ db_post_title, $ model_post_title);Zoals u kunt zien, is de code precies hetzelfde als die in kern-PHP zou zijn geweest. We hebben zojuist Laravel-specifieke afhankelijkheden geïmporteerd waarmee we de vereiste API's kunnen gebruiken. In de
testAccessorTest
methode, we zijn verondersteld om de juistheid van de te testengetNameAttribute
methode van dePost
model-.Om dat te doen, hebben we een voorbeeldpost opgehaald uit de database en de verwachte uitvoer voorbereid in de
$ db_post_title
variabel. Vervolgens laden we dezelfde post met behulp van het Eloquent-model dat degetNameAttribute
methode ook om de titel van het bericht voor te bereiden. Ten slotte gebruiken we deassertEquals
methode om beide variabelen zoals gebruikelijk te vergelijken.Dus dat is hoe je eenheidstestgevallen moet voorbereiden in Laravel.
Functioneel testen
In deze sectie maken we de functionele testcase die de functionaliteit test van de controller die we eerder hebben gemaakt.
Voer de volgende opdracht uit om de. Te maken
AccessorTest
functionele testcase klasse. Omdat we de. Niet gebruiken--eenheid
sleutelwoord, het zal worden behandeld als een functionele testcase en onder deproeven / Feature
directory.$ php artisan make: test AccessorTestHiermee maak je de volgende les op
proeven / Functie / AccessorTest.php
.assertTrue (true);Laten we het vervangen door de volgende code.
naam); $ response = $ this-> get ('/ accessor / index? id = 1'); $ Response-> assertStatus (200); $ Response-> assertSeeText ($ db_post_title);Nogmaals, de code moet bekend voorkomen bij mensen die ervaring hebben met functioneel testen.
Ten eerste halen we een voorbeeldbericht uit de database en bereiden we de verwachte uitvoer voor in de
$ db_post_title
variabel. Hierna proberen we het te simuleren/ Accessor / index? Id = 1
GET verzoek en pak de reactie van dat verzoek in de$ response
veranderlijk.Vervolgens hebben we geprobeerd de responscode in de
$ response
variabele met de verwachte responscode. In ons geval zou dit 200 moeten zijn, want we zouden een geldig antwoord moeten krijgen voor ons GET-verzoek. Verder moet het antwoord een titel bevatten die begint met een hoofdletter en dat is precies wat we proberen te matchen met deassertSeeText
methode.En dat is een voorbeeld van de functionele testcase. Nu hebben we alles waarmee we onze tests kunnen uitvoeren. Laten we doorgaan en de volgende opdracht uitvoeren in de hoofdmap van uw toepassing om alle tests uit te voeren.
$ PHPUnitDat zou alle tests in uw toepassing moeten uitvoeren. U zou een standaard PHPUnit-uitvoer moeten zien die de status van tests en beweringen in uw toepassing weergeeft.
En daarmee staan we aan het einde van dit artikel.
Conclusie
Vandaag hebben we de details van testen in Laravel onderzocht, die PHPUnit al in zijn kern ondersteunt. Het artikel begon met een basisinleiding voor unit- en functionele testen en naarmate we verder gingen, onderzochten we de details van testen in de context van Laravel..
Tijdens het proces hebben we een handvol voorbeelden gemaakt die aantoonden hoe je unit- en functionele testcases kunt maken met behulp van de artisan-opdracht.
Als je net bent begonnen met Laravel of je kennis, site of applicatie met uitbreidingen wilt uitbreiden, hebben we een aantal dingen die je kunt bestuderen in Envato Market.
Aarzel niet om uw mening te geven met behulp van de onderstaande feed!