Geen enkele software is vrij van bugs. Dit is een principe dat voor elke programmeertaal en elke applicatie geldt.
Wanneer deze bugs op je productiesite terechtkomen, kun je hiervan nadelige gevolgen ondervinden – in verschillende gradaties van ernst. Dit zijn enkele voorbeelden, variërend van vervelend tot economisch schadelijk:
- Mild: Een gebruiker kan niet op een dode link klikken.
- Ernstig: De “Verzenden” knop van een contactformulier werkt niet, wat de gebruiker pas ontdekt nadat hij zijn bericht heeft geschreven.
- Ernstig: Een betalingsgateway die niet correct geconfigureerd is, waardoor gebruikers geen producten in je e-commercewinkel kunnen kopen en de site verlaten.
Geen enkele tool is voldoende om alle aspecten van het testen van een applicatie vanuit alle mogelijke invalshoeken aan te kunnen. Naast het opsporen van bugs is het van vitaal belang om extra tests uit te voeren om andere features van de applicatie te testen, zoals:
In dit artikel bespreken we 10 door de open-source community gemaakte tools die kunnen helpen een stack te vormen voor het testen van PHP code in WordPress plugins. Sommige van deze tools zijn speciaal ontworpen voor het testen van PHP code; anderen zijn bedoeld voor het testen van WordPress code; en nog een paar andere tools zijn gemaakt om algemene features te handlen die nuttig zijn bij het testen.
1. DevKinsta
DevKinsta is een lokaal ontwikkelingspakket voor WordPress sites. Door een paar basisgegevens op te geven wordt meteen een lokale instantie van een WordPress site geïnstalleerd en het wordt gebundeld met verschillende handige ontwikkeltools zoals een e-mailinbox, databasemanager, en logboekregistratie om makkelijker problemen op te lossen.
DevKinsta wordt gewoonlijk gebruikt door ontwikkelaars en ontwerpers bij het maken van hun WordPress thema’s en plugins. Maar het kan ook worden gebruikt als een lokale webserver voor het uitvoeren van integratie- en functionaliteitstesten. Dit gebeurt in combinatie met een HTTP tool die je helpt te controleren of je responscontent en headers juist zijn.
DevKinsta’s belangrijkste features zijn:
- Makkelijk om een nieuwe WordPress omgeving op te zetten en te verwijderen als hij niet meer nodig is
- Maakt testen mogelijk met elke ondersteunde versie van PHP en WordPress, en elke combinatie daarvan
- Integreert naadloos met MyKinsta waar gebruikers een externe backup van hun sites en gegevens kunnen maken
2. PHPUnit
PHPUnit is een op programmeurs gericht testframework voor PHP. Het is het populairste framework voor het uitvoeren van unittests in PHP code, met als doel afzonderlijke eenheden van sourcecode te valideren.
Met PHPUnit tests kunnen ontwikkelaars zo vroeg mogelijk in de ontwikkelingscyclus problemen opsporen, en er zo voor helpen zorgen dat er geen coderegressies zijn ingevoerd (d.w.z. dat veranderingen aan een bepaald stukje code niet ergens anders problemen hebben veroorzaakt).
De belangrijkste features van PHPUnit zijn:
- Testen van nieuwe features
- Nieuw geherstructureerde codevalidatie
- Kan volledig geautomatiseerd worden uitgevoerd binnen het Continuous Integration proces naar keuze
- Debuggen
- Automatische documentatie over het verwachte gebruik door middel van functionaliteit invocation en constraints
- Maakt de Test-Driven Development (TDD) aanpak mogelijk waarbij ontwikkelaars eerst tests maken, dan pas functionaliteit
3. Brain Monkey
Brain Monkey is een testprogramma voor PHP en WordPress. Het biedt framework-agnostische tools waarmee je PHP methoden kunt herdefiniëren en het gedrag van elke PHP applicatie kunt testen. Het biedt ook tools specifiek voor het testen van WordPress code.
De belangrijkste features van Brain Monkey zijn:
- Binnen deze tool is interactie mogelijk tussen unittests en externe, unloaded libraries
- Staat invocation van WordPress functies toe zonder dat de WordPress omgeving geladen hoeft te worden
- Kan testen of WordPress functies (zoals
add_filter
ofdo_action
) functionaliteit aanroepen zoals verwacht
4. Brain Faker
Brain Faker gebruikt Faker (een populaire PHP library voor het genereren van nepdata) en Brain Monkey om makkelijk nep WordPress objecten en verwante functies te genereren die je kunt uitproberen, waaronder:
WP_Post
instanties en test verwante functies zoalsget_post
enget_post_field
WP_User
instanties en test verwante functies alsget_userdata
,get_user_by
,user_can
, en meerWP_Term
instanties en test verwante functies zoalsget_term
enget_term_by
WP_Comment
instantiesWP_Site
instanties en test verwante functies zoalsget_site
WP_Post_Type
instanties en test verwante functies zoalsget_post_type_object
enpost_type_exists
WP_Taxonomy
instanties en test verwante functies zoalsget_taxonomy
entaxonomy_exists
WP_Error
instanties
De belangrijkste features van Brain Faker zijn:
- Injecteert neppe maar realistische WordPress data in de unittest – de toegang tot de gewijzigde datum van een nepartikel zal zich gedragen als een datum (bv.
2022-04-17T13:06:58+00:00
), de gebruikersnaam zal passend zijn (bv."John Smith"
), een instantie van een nepartikel is geschreven door een instantie van een nepgebruiker, enzovoort - Nepdata kunnen vooraf verstrekt worden of willekeurig gegenereerd worden
- Uitbreidbaar – ontwikkelaars kunnen klassen en functies van hun eigen WordPress plugins namaken
5. Mockery
Mockery is een eenvoudig maar flexibel PHP mockobjectframework dat bedoeld is om samen met PHPUnit, PHPSpec, of een ander unittestingframework te gebruiken. Het biedt een dubbel testframework dat in staat is alle mogelijke objectbewerkingen en interacties te definiëren met behulp van een door mensen leesbare Domain Specific Language (DSL).
De belangrijkste features van Mockery zijn:
- Maakt het flexibel genereren van mockobjecten en stubs mogelijk (die vooraf gedefinieerde standaardantwoorden bieden op specifieke call die tijdens tests worden gedaan)
- Verbetert de testisolatiemogelijkheden van PHPUnit
- Flexibele API om mocked expectations uit te drukken, die zo veel mogelijk een natuurlijke taalbeschrijving nabootst (bv.
$mock->shouldReceive('myMethod')->once()->andReturn('Hello world!');
) - Unittesten gebruiken in-memory mockobjecten om te voorkomen dat tragere systemen (zoals databases, bestandssystemen, of externe diensten) nodig zijn
- Kan zowel deterministisch als niet-deterministisch gedrag nabootsen
6. WordPress eigen exporttool
De eigen exporttool van WordPress downloadt de WordPress gegevens van de site naar je toestel als een XML bestand, inclusief berichten, pagina’s, aangepaste berichttypes, commentaar, aangepaste velden, categorieën, tags, aangepaste taxonomieën, gebruikers, en media. Het XML bestand heeft een aangepast format (WordPress eXtended RSS of WXR bestand genoemd) dat in elke WordPress site geïmporteerd kan worden.
Deze tool is niet speciaal ontworpen om te testen. Het nut ervan komt echter voort uit de mogelijkheid om snapshots van de WordPress database te maken die een geschikte dataset bevatten, die dan gebruikt kan worden om te testen. Dit betekent dat de WordPress site in productie, die echte gegevens bevat, geëxporteerd kan worden en in een ontwikkelings- of testinstantie ingevoerd kan worden om nieuwe functionaliteit te testen.
De belangrijkste features van het WordPress exporttool zijn:
- Creëren van testgegevens met behulp van een echte WordPress site
- Deelbaar exportbestand van de hele database
- Nuttig voor zowel integratie als unittesten
7. Guzzle
Guzzle is een PHP HTTP client die het makkelijk maakt HTTP verzoeken te sturen en te integreren met webdiensten.
Guzzle is een algemene tool, dus testen is slechts een van zijn mogelijke use cases. Samen met een lokale webserver, zoals DevKinsta, maakt Guzzle het mogelijk integratietests uit te voeren: Je kunt Guzzle gebruiken om een HTTP verzoek te sturen naar de ontwikkelwebserver, en dan het antwoord doorgeven aan een unittest in PHPUnit die controleert of de content en headers zijn ingesteld zoals verwacht.
De belangrijkste features van Guzzle zijn:
- Voldoet aan de PHP standaard aanbeveling “PSR-7” (voor HTTP berichtinterfaces), waardoor uitsluiting van vendor lock-in mogelijk is
- Eenvoudig en snel
- Tests worden uitgevoerd op een echte WordPress site, wat de betrouwbaarheid verhoogt
- Kan vanuit PHPUnit worden uitgevoerd voor gemak en snelheid
- Integratietesten kunnen geautomatiseerd worden en aan het Continuous Integration proces worden toegevoegd
8. WP-CLI
WP-CLI is de opdrachtregelinterface voor WordPress. Je kunt er plugins mee bijwerken, Multisite installaties configureren en nog veel meer, zonder een webbrowser te gebruiken.
WP-CLI is niet specifieke een testtool, maar testen behoort tot de vele use cases. Bijvoorbeeld, nadat je een nieuwe ontwikkelingswebserver hebt opgestart, kun je een bash script uitvoeren met WP-CLI opdrachten om testgegevens in de WordPress site te importeren, de gebruikers met de juiste rollen en mogelijkheden aan te maken, benodigde exterbe plugins te installeren, en andere dergelijke taken.
Omdat het script met de WP-CLI commando’s in je Git repository kan worden opgeslagen, kan het proces om integratietests uit te voeren worden geautomatiseerd en in je Continuous Integration proces worden geïntegreerd:
- Gebruik de WordPress exporttool om echte testgegevens te genereren, en sla ze op in de Git repository.
- Gebruik DevKinsta om een webserver met een nieuwe WordPress instantie te starten.
- Gebruik WP-CLI om de testgegevens in de WordPress site te importeren (DevKinsta kan via WP-CLI bediend worden).
- Maak een unittest in PHPUnit die Guzzle een HTTP verzoek op de webserver laat uitvoeren om je responscontent en headers te verifiëren.
WP-CLI’s belangrijkste features zijn:
- Maakt het mogelijk op afstand opdrachten uit te voeren op een WordPress instantie via een opdrachtregelinterface
- Uitbreidbaar met andere tools
- Verbetert de mogelijkheden van de teststack
- Maakt volledige automatisering van het proces mogelijk
9. XDebug
XDebug is een uitbreiding voor PHP die een reeks mogelijkheden biedt om de PHP ontwikkelingservaring te verbeteren, waaronder debugging, verbeteringen in PHP’s foutenrapportage, tracering, profilering, en analyse van de codedekking.
XDebug helpt je niet je code te testen, maar helpt je uit te zoeken waar de fout zit. Het combineren van XDebug met PHPUnit is bijzonder effectief: Als een test mislukt en je kunt de bron van het probleem niet vinden, kun je XDebug gebruiken om breekpunten in de code van de unittest aan te brengen. Als je de unittest opnieuw uitvoert, wordt het PHP script op elk van die breekpunten gepauzeerd, zodat je de huidige toestand van de uitvoering kunt inspecteren (call stack, property en objectwaarden, enz.) en proberen te ontdekken wat er mis is.
De belangrijkste features van XDebug zijn:
- Bevat integraties voor populaire PHP editors, waaronder VS Code, PHPStorm en Sublime
- Maakt een profiel van hoeveel tijd er in elke functiecall gaat zitten en hoeveel geheugen die verbruikt
- Veel krachtiger dan eenvoudig
var_dump
gebruiken om code te debuggen - Maakt het mogelijk om variabele waarden rechtstreeks te wijzigen bij het pauzeren op breekpunten
10. PHPStan
PHPStan is een statische analysetool voor PHP, ontworpen om bugs in de code te vinden nog voor je tests schrijft.
Het doel van PHPStan is om het aantal tests dat ontwikkelaars moeten schrijven te verminderen. Deze tool wordt als eerste in de teststack uitgevoerd, en vangt preventief zo veel mogelijk bugs op. Alleen bugs die niet uit statische analyse afgeleid kunnen worden (bv. die met gebrekkige logica) moeten via unittests worden gevalideerd.
PHPStan werkt door de hele codebase te scannen en te zoeken naar mismatches. Bijvoorbeeld, de antwoordwaarde van een functie die een float teruggeeft kan niet toegewezen worden aan een functieparameter van het type integer. Als de code zo’n voorval bevat, is dat een potentiële bug, en PHPStan waarschuwt je ervoor tijdens de ontwikkelingsfase, terwijl je de applicatiecode schrijft.
De belangrijkste features van PHPStan zijn:
- Automatisering en integratie binnen je bestaande Continuous Integration proces
- Lokaliseert veel lastige bugs, zoals type mismatches
- Scant de hele codebase en vindt bugs in zelden uitgevoerde delen van code
- Georganiseerd in niveaus van toenemende complexiteit om geleidelijke integratie mogelijk te maken
- Bevat uitbreidingen voor de meest populaire PHP frameworks en CMS’en, waaronder Symfony, Laravel, Doctrine, Nette, en WordPress.
Samenvatting
Het gevolg van het ongemerkt binnendringen van bugs in je applicatie in productie kunnen schadelijk zijn voor je reputatie en inkomen, dus moet je proberen ze uit te roeien voor ze je gebruikers treffen.
In complexe applicaties is het bijna onmogelijk om 100% zeker van te zijn dat er geen bugs in zullen zitten. Daarom moet je een proces opzetten om tijdens de eerste ontwikkelingscyclus zo veel mogelijk bugs te vinden en te verwijderen.
Met een goed ontworpen testtoolkit kun je de kans dat je applicatie zich op onverwachte manieren gedraagt sterk verkleinen. De open-source community heeft een overvloed aan tools gemaakt en beschikbaar gesteld om de verschillende aspecten van een applicatie te testen, die je kunt – en zou moeten! – gebruiken om een uitgebreide teststack te maken.
In dit artikel hebben we 10 tools besproken om je te helpen je doelen te bereiken bij het testen van PHP code in een WordPress plugin.
Welke van deze tools heb jij gebruikt voor je laatste project? Laat ons weten wat je ermee bouwde in de commentaarsectie hieronder!
Laat een reactie achter