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

Gegevens van een lokale WordPress site in DevKinsta.
Gegevens van een lokale WordPress site in 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:

2. PHPUnit

PHPUnit logo.
PHPUnit logo.

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 logo.
Brain Monkey logo.

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 of do_action) functionaliteit aanroepen zoals verwacht

4. Brain Faker

Brain Faker op GitHub.
Brain Faker op GitHub.

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 zoals get_post en get_post_field
  • WP_User instanties en test verwante functies als get_userdata, get_user_by, user_can, en meer
  • WP_Term instanties en test verwante functies zoals get_term en get_term_by
  • WP_Comment instanties
  • WP_Site instanties en test verwante functies zoals get_site
  • WP_Post_Type instanties en test verwante functies zoals get_post_type_object en post_type_exists
  • WP_Taxonomy instanties en test verwante functies zoals get_taxonomy en taxonomy_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 op GitHub.
Mockery op GitHub.

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 WordPress exporttool.
De WordPress 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 logo.
Guzzle logo.

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 logo.
WP-CLI logo.

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:

  1. Gebruik de WordPress exporttool om echte testgegevens te genereren, en sla ze op in de Git repository.
  2. Gebruik DevKinsta om een webserver met een nieuwe WordPress instantie te starten.
  3. Gebruik WP-CLI om de testgegevens in de WordPress site te importeren (DevKinsta kan via WP-CLI bediend worden).
  4. 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 logo.
XDebug logo.

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 logo.
PHPStan logo.

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!

Leonardo Losoviz

Leo writes about innovative web development trends, mostly concerning PHP, WordPress and GraphQL. You can find him at leoloso.com and twitter.com/losoviz.