Als alle testcases na bouwen probleemloos zouden draaien, zou je ze zo lang kunnen maken als je wil. Maar dan zouden ze tegelijkertijd zinloos zijn. Geautomatiseerde testen zullen falen. Omdat er een fout is ontstaan of omdat de applicatie is aangepast. Daarom gaat het niet alleen om de ideale testcases voor je testuitvoering, maar ook om de onderhoudbaarheid van de geautomatiseerde testset.
Tegelijkertijd wil je meer doen dan alleen maar hele kleine testen uitvoeren. Je wil een keten van handelingen testen. Iets invoeren en daarna weer opvragen. Of weten of je applicatie goed werkt van stap A naar stap B naar stap C. Dat vraagt om langere testcases of misschien zelfs wel op testcases, die elkaar opvolgen.
Maar hoe kom je nu tot een goed evenwicht?
Tijdsduur
Voor de onderhoudbaarheid van een testcase, is het verstandig dat de tijdsduur niet te lang is. Als een testcase faalt, moet je hem opnieuw kunnen draaien en volledig kunnen volgen. En daarna weer opnieuw kunnen draaien en opnieuw en opnieuw en opnieuw. Om dit goed te ondersteunen, is mijn eerste streven altijd om elke testcase uiterlijk rond de 5 minuten te laten duren. Als hierin echt te weinig getest kan worden, heb ik wel de keuze gemaakt om uit te breiden naar 10 minuten. Maar langere testcases zijn niet goed onderhoudbaar, omdat dit te lang duurt om ook je aandacht er goed bij te houden.Onafhankelijkheid
De ideale situatie is een test, die altijd kan draaien, onafhankelijk van welke testcase dan ook. Maar zeker als je een hele keten wil testen, ga je al snel over de 10 minuten heen. Toch moet het streven blijven om de testcases zo onafhankelijk mogelijk te laten draaien. Ik houd hierbij het volgende streven aan: als er voorbereidende testcases zijn, is het nodig om deze 1 keer uit te voeren. Hierna kan de testcase oneindig herhaalt worden, zonder nieuwe voorbereiding.Als ik de tijdsduur niet in kan schatten, begin ik met mijn ideaal: alles in 1 testcase. Wanneer de test dan te lang blijkt, ga ik na welke onderdelen ik los kan testen. Zo kan, na het aanmaken van bijvoorbeeld een werknemer, de controle van de werknemer in een andere testcase geplaatst worden. Ook het gebruiken van de werknemer in andere schermen kan in andere, losse testcases.
Als er een keten is, dan kan deze vaak opgesplitst worden per menu-item. Dit klinkt misschien als een vreemde indeling, maar het openen van een ander scherm via een menu-item geeft vaak een duidelijke nieuwe stap in de keten aan. Terwijl de handelingen, die je uitvoert, voordat je het menu weer gebruikt, vaak sterk met elkaar gerelateerd zijn.
Testdekking
Het liefst test ik alle velden van alle schermen in 1 testcase. Maar hoe groter de schermen en hoe meer schermen, des te moeilijker dit wordt. Maar tegelijkertijd wil je niet een ongelofelijke hoeveelheid testcases, waarvan je niet meer weet welke testcases wat test. Daarom heb ik in de loop van de tijd bepaalde standaarden ontwikkeld:
Testen van een groep gegevens
Een testcase kan gericht worden op het opslaan en tonen van alle gegevens in een bepaalde groep op je scherm. Door alle gegevens van een groep in dezelfde testcase te testen, houd je de testcases beter onderhoudbaar.
Een testcase kan gericht worden op het opslaan en tonen van alle gegevens in een bepaalde groep op je scherm. Door alle gegevens van een groep in dezelfde testcase te testen, houd je de testcases beter onderhoudbaar.
Testen van onderlinge relaties van gegevens
Bij voorkeur test ik groepen van gegevens samen, als ze een onderlinge relatie hebben. Denk hierbij aan velden, die gevuld worden op basis van ingevoerde gegeven. Of denk aan velden, die verdwijnen en verschijnen n.a.v. bepaalde keuzen. Maar als dit teveel wordt, bijvoorbeeld omdat groepen teveel relaties hebben, splits ik ze op in verschillende testcases. De invoer kan dan beperkt worden tot de gegevens invoer, die effect heeft op een andere groep. Of de in te voeren groepen kunnen beperkt worden tot 2 en de test is volledig gericht op het testen van de relatie tussen deze twee groepen.
Bij voorkeur test ik groepen van gegevens samen, als ze een onderlinge relatie hebben. Denk hierbij aan velden, die gevuld worden op basis van ingevoerde gegeven. Of denk aan velden, die verdwijnen en verschijnen n.a.v. bepaalde keuzen. Maar als dit teveel wordt, bijvoorbeeld omdat groepen teveel relaties hebben, splits ik ze op in verschillende testcases. De invoer kan dan beperkt worden tot de gegevens invoer, die effect heeft op een andere groep. Of de in te voeren groepen kunnen beperkt worden tot 2 en de test is volledig gericht op het testen van de relatie tussen deze twee groepen.
Testen gericht op specifieke controles
Bepaalde controles kunnen los getest worden. Neem bijvoorbeeld het wel of niet verschijnen van bepaalde velden. Of de aangeboden keuzes in een selectiedialoog. Als deze controles belangrijk zijn, maar in een scherm aardig wat tijd vragen om te testen, kan je ze lostrekken in een nieuwe testcase. Door deze testcase helemaal op deze controle te richten en ook in andere schermen deze controles in speciale testcases uit te voeren, houd je wel overzicht op je testcases. Je weet altijd wat er in een testcase getest wordt en wat niet, zonder uitgebreide documentatie na te kijken.
Bepaalde controles kunnen los getest worden. Neem bijvoorbeeld het wel of niet verschijnen van bepaalde velden. Of de aangeboden keuzes in een selectiedialoog. Als deze controles belangrijk zijn, maar in een scherm aardig wat tijd vragen om te testen, kan je ze lostrekken in een nieuwe testcase. Door deze testcase helemaal op deze controle te richten en ook in andere schermen deze controles in speciale testcases uit te voeren, houd je wel overzicht op je testcases. Je weet altijd wat er in een testcase getest wordt en wat niet, zonder uitgebreide documentatie na te kijken.
Tijdsbesparing
Er zijn twee keuzes, die je kan maken, om de testcases korter te maken. Deze hebben nadelen en daarom is het verstandig de voor- en nadelen goed te overwegen.
Gebruik van data in een database
Om een volledige keten te testen, maar tegelijkertijd je testen kort en onafhankelijk te houden, kan je ervoor kiezen de "tussenproducten" van een keten alvast beschikbaar te maken in een database. Dit heeft zelfs als extra voordeel, dat je test of de aanpassing ook met bestaande data werkt. Maar een belangrijk nadeel is: je test niet de volledige keten van het begin tot het eind in 1 keer.
Verschillende situaties in 1 test
Als je toch in 4 testcases de medewerkersgegevens invoert, kan je deze meteen gebruiken om wat verschillende situaties te testen: een naam met en een naam zonder tussenvoegsel; een man en een vrouw; een adres in het buitenland en een adres in Nederland. Dit heeft twee risico's: je moet goed weten welke situatie je in welke testcase toevoegt. Dit vraagt om documentatie, al of niet in de code. En daar moet je tijd voor vrijmaken. En als tweede nadeel: als de test faalt, weet je dan nog waardoor? Als een medewerker niet goed wordt opgeslagen en de melding "Het adres is niet correct" verschijnt, komt dit dan door het buitenlandse adres? Of komt dit doordat je een huisnummer toevoeging hebt ingevoerd? Meer situaties in een test kan meer analysetijd tot gevolg hebben, als je test faalt.
En nu van start
Testautomatisering testcases bepalen is een kwestie van oefenen, uitproberen en later aanpassen. Houd vooral de tijdsduur van een testcase in de gaten. Naar mijn mening gaat de tijdsduur boven de onafhankelijkheid. Maar houd bij voorkeur je testcase zo, dat deze achter elkaar meerdere keren uitgevoerd kan worden. Bepaal een goede indeling van je testcases qua testdekking. En houd deze over al je testen aan. Eventueel kan je je testcases gebruik laten maken van bestaande data in de database. En ook het testen van meerdere situaties in een testcase is een optie.
Maar ga vooral gerust aan de gang. Als je testcases te groot zijn, kan je ze kleiner maken. En als het er teveel zijn, kan je ze samenvoegen. Ook de indeling van je automatische test is niet gegoten in beton!