Geautomatiseerd testen is een essentieel onderdeel van moderne softwareontwikkeling. Software van hoge kwaliteit is gemakkelijker om aan te werken, vertoont minder problemen en en stopt niet met functioneren als je er nieuwe functies aan toevoegt. Hoge kwaliteit komt niet zomaar tot stand. Rigoureus testen is de laatste en allesbepalende stap voorafgaand aan deployment. In dit artikel lees je hoe testbare systemen worden gebouwd, wat de verschillen zijn tussen handmatig en geautomatiseerd testen en hoe je testbare systemen bouwt.
Testbare systemen zijn het resultaat van begrijpelijke, sterk samenhangende en ‘loosely coupled’ code. Dat laatste betekent dat een verandering in een deel van een systeem niet direct een andere verandering of probleem veroorzaakt. En ‘sterk samenhangend’ verwijst naar systemen waarin vergelijkbare taakgebieden geclusterd zijn. Systemen die op deze manier gebouwd zijn, zijn gemakkelijker te begrijpen. Daardoor is software sneller te doorzien en gemakkelijk uit te breiden, aan te passen of te debuggen.
Voordelen van geautomatiseerd testen
Testen van software gebeurt steeds vaker geautomatiseerd en daar is veel voor te zeggen. Naarmate systemen groter zijn, vereist handmatig testen meer handmatige menskracht. Het kost relatief veel tijd waardoor je minder vaak software kunt releasen. En omdat handmatig testen routinewerk is, kunnen er (terugkerende) fouten insluipen. Bij geautomatiseerd testen wordt het verwachte gedrag van functionaliteit gecodeerd, zodat een computer de test kan uitvoeren. Ontwikkelaars ontvangen automatisch een rapportage met geconstateerde fouten.
Geautomatiseerd testen vergt weliswaar een extra codeerstap, maar de voordelen ervan zijn groot. Het coderen van de specificaties is een eenmalige stap – tenzij je nieuwe functionaliteit wil testen. Het coderen van specificatie dwingt testers en ontwikkelaars om na te denken over wat functionaliteit moet doen. Geautomatiseerd testen kan in korte tijd en het proces kun je foutloos herhalen.
Test-Driven Development (TDD)
Bij het ontwikkelen van software kan je vooraf al rekening houden met geautomatiseerd testen. Bij Test-Driven Development (TDD) schrijven ontwikkelaars al geautomatiseerde unit-tests voordat ze de code schrijven. Dat dwingt ontwikkelaars vooraf na te denken over welke stappen ze moeten nemen om een functie te implementeren. Het leidt ook tot minder complexe systemen, omdat testers op deze manier streven naar eenvoud. Ontwikkelaars die TDD toepassen, zijn gemiddeld sneller en leveren systemen met minder defecten dan ontwikkelaars die volgens conventionele methoden werken.
Drie soorten geautomatiseerd testen
Met betrekking tot geautomatiseerd testen bestaan er drie verschillende varianten: unit-testen, acceptatietesten en end-to-end testen.
- Unit-testen worden door ontwikkelaars uitgevoerd om de juiste functie van units te valideren – de kleinste onderdelen van de code. In de meeste objectgeoriënteerde talen zijn dit ‘klassen’, maar het kunnen ook ‘methoden’ of ‘functies’ zijn. Unit-testen kijken echter niet naar de samenstelling van units. Om te valideren dat alles werkt zoals bedoeld, heb je acceptatietesten nodig.
- Acceptatietesten (ook wel integratietesten of systeemtesten genoemd) zijn formele documenten die specificeren hoe een systeem zich moet gedragen vanuit het oogpunt van de business. Waar een unit-test wordt geschreven voor en door ontwikkelaars, worden acceptatietesten geschreven voor en door de afnemer. En waar unit-tests betrekking hebben op de interne kwaliteit, hebben acceptatietests betrekking op de externe kwaliteit. Bij het schrijven van acceptatietesten worden vaak Behavior-Driven Development (BDD) testframeworks gebruikt, bijvoorbeeld SpecFlow voor C#, Cucumber of Fitnesse voor Java, Codeception voor PHP of GinkGo/GoBDD voor Go.
- End-to-end testen ‘gebruiken’ een systeem via de gebruikersinterface door berichten naar een API te sturen, door webservices aan te roepen en door rapporten te analyseren. Het proces van end-to-end testen verloopt langzamer dan unit-testen, maar heeft beslist zijn waarde. End-to-end testen zorgt ervoor dat alle geïntegreerde componenten van een systeem (van front-end en backend tot databases en externe API’s) samenwerken zoals verwacht.
Automatische testen bij CI/CD-softwareontwikkeling
Bij software die ontwikkeld wordt op basis van Continuous Integration/Continuous Delivery-principes (CI/CD) worden alle tests geautomatiseerd uitgevoerd, voordat een wijziging in productie wordt gedeployed. Dat gaat het gemakkelijkst met ontwikkelplatforms zoals Azure DevOps en GitLabsm die het uitvoeren van unittests out-of-the-box ondersteunen. End-to-end acceptatietests moeten in een daadwerkelijke omgeving worden uitgevoerd. Als zo’n acceptatietest mislukt, zorgt de fail status in de CI/CD-pipeline ervoor dat de software niet naar productie wordt gedeployed.
Best practices voor geautomatiseerd testen
Tot slot delen we nog een viertal best practices voor geautomatiseerd testen tijdens softwareontwikkeling.
- Houd testsuites zo klein mogelijk. Richt je op wat het systeem moet doen, niet op wat het niet moet doen. Dit betekent dat je de verwachte flow test en niet alle mogelijke foutscenario’s.
- Focus op kritieke paden. Hoe groter de impact als er iets misgaat, hoe belangrijker het is om dit automatisch te testen.
- Tests hebben net als code regelmatig refactoring nodig. Schone tests zijn net zo belangrijk als schone code. Plan regelmatig tijd in om je tests op te schonen.
- Tests mogen niet afhankelijk zijn van de presentatie van de GUI (graphical user interface). GUI’s zijn veranderlijk, daarom moeten GUI-tests gebaseerd zijn op elementen in de interface en niet op aspecten zoals positie of kleur.
Download dit whitepaper over geautomatiseerd testen in softwareontwikkeling
Ontdek waardevolle inzichten en praktische tools voor het verbeteren van je testprocessen en het waarborgen van softwarekwaliteit. Begin vandaag nog met het optimaliseren van je ontwikkelingsworkflow!
Op zoek naar betrouwbare softwareontwikkelingsdiensten?
Ontdek hoe we kunnen helpen.
- Anneke van der Putten
- Call: +31 (0)30 782 0111
- anneke@netrom.nl
- Ronald Bouwmeister
- Call: +31 (0)30 782 0117
- ronald@netrom.nl