zaterdag 11 juni 2016

100% dekking bij testen heeft zo zijn gevaren

100% code coverage. Alle eisen hebben een testcase. Er zijn verschillende manieren om na te gaan of iets 100% gedekt is tijdens het testen. En het is een van de meest eenvoudige methodes om na te gaan of de test betrouwbaar is geweest. Alleen is de vraag of de test ook werkelijk betrouwbaar is. Je kan een 100% dekking hebben van iets, maar tegelijkertijd kan de test weinig tot niets toevoegen aan je kwaliteitsgarantie. Hieronder wil ik twee voorbeelden verder uitwerken. Niet met het doel een 100% dekking als onbelangrijk af te doen. Maar wel om mensen verder te laten kijken dan alleen "Heb ik alles getest". Belangrijker is "Heb ik alles goed getest".

Het gevaar van 1 waarde

Stel je hebt een applicatie waarin persoonsgegevens worden beheert. Elke aangemaakte persoon krijgt als standaard geslacht de waarde "Man". En stel dat je nu een test bedenkt of programmeert waar een persoon wordt aangepast. En deze test bevat de volgende regel:
GESLACHT = MAN
Je wil bij deze test dus het geslacht wijzigen naar man. Daarom maak  je snel een persoon aan en ga je daarna de gegevens wijzigen. Dus van de nieuwe persoon wijzig je het geslacht van man naar man. Anders gezegd: je test eigenlijk niets. Want als de wijziging niet opgeslagen wordt, is het geslacht man. Maar als de wijziging opgeslagen wordt ook.

Waar het om gaat is, dat als je een gegeven in al je testen slechts een waarde geeft, de waarde per ongeluk  de juiste waarde kan hebben. Dit is op twee manieren te voorkomen:

1. Controleer voor de wijziging of het betreffende gegeven een een andere waarde heeft

GESLACHT <> MAN
2. Geef  het gegeven tijdens je testen twee verschillende waardes en controleer dit ook tweemaal. Dit verkleint de kans dat de gegevens per ongeluk elke keer opnieuw toch de gewenste waarde hadden.


Het gevaar van condities

Stel je hebt een applicatie waarmee je kortingen berekent. Een van de voorwaarden voor korting is de volgende

LEEFTIJD > 18 OR WOONPLAATS = UTRECHT
Een persoon krijgt dus volgens de code alleen korting als hij ouder is dan 18 en woont in Utrecht. Maar stel nu dat de persoon ook 18 jaar mag zijn, hoe haal je dit dan uit de test? En stel dat de korting eigenlijk alleen uitgevoerd mag worden als de de leeftijd 18 jaar en ouder is, maar ook de woonplaats Utrecht is?

LEEFTIJD >= 18 AND WOONPLAATS = UTRECHT

Met de volgende testcase in ieder geval niet
LEEFTIJD = 20
WOONPLAATS = UTRECHT
 Je hebt nu alles getest. De korting is toegekend. Maar de fouten zitten er nog in.

Stel nu dat je slim bent en je wilt de randgevallen testen. Randgevallen zijn in ieder geval die twee waardes die er net voor zorgen dat de uitkomst anders is. In het geval van 18 jaar en ouder zijn dat dus de leeftijden 17 en 18. De leeftijd 17 geeft geen korting, de leeftijd 18 wel. Nu komt er wel een fout naar boven. Als de leeftijd 17 is, dan krijg je alsnog korting. Verder testen zou aantonen dat ook de leeftijd 16, 15 14 en 13 alsnog korting zouden geven. Dus er moet nog uitgebreider getest worden.

Als er voorwaarden zijn, die de woorden "en" of "of"bevatten (door ontwikkelaar eerder AND of OR genoemd), is het regelmatig handig om hier meerdere testen aan te besteden. Mijn favoriete methode is het aantal condities + 1. Op de volgende wijze uitgewerkt

A AND B AND C
A = TRUE, B = TRUE, C = TRUE => Resultaat = TRUE
A = FALSE, B = TRUE, C = TRUE => Resultaat = FALSE
A = TRUE, B = FALSE, C = TRUE => Resultaat = FALSE
A = TRUE, B = TRUE, C = FALSE => Resultaat = FALSE 

Wat bij de onderste drie testcases gebeurt, is het volgende: ze verschillen slechts 1 waarde met het TRUE resultaat. Hierdoor kan je ervan uitgaan, dat als deze twee testcases het gewenste resultaat geven, het resultaat door de conditie met het verschil veroorzaakt wordt. Daarmee is die betreffende conditie 100% gedekt getest en niet alleen de volledige verzameling condities als geheel. En dat maakt de test een stuk betrouwbaarder.

En de andere variant

A OR B OR C
A = FALSE, B = FALSE, C = FALSE => Resultaat = FALSE
A = TRUE, B = FALSE, C = FALSE => Resultaat = TRUE
A = FALSE, B = TRUE, C = FALSE => Resultaat = TRUE
A = FALSE, B = FALSE, C = TRUE => Resultaat = TRUE 
Als je de grensgevallen en de AND/OR testen combineert, kom je dan op de volgende testcases uit:

LEEFTIJD = 18 AND WOONPLAATS = UTRECHT => Gewenste resultaat is korting
LEEFTIJD = 17 AND WOONPLAATS = UTRECHT => Gewenste resultaat is geen korting
LEEFTIJD = 18 AND WOONPLAATS = AMERSFOORT => Gewenste resultaat is geen korting
Wanneer alle drie slagen, dan kan je ervan uitgaan dat je de eis qua condities voldoende hebt getest.






Geen opmerkingen:

Een reactie posten

Opmerking: Alleen leden van deze blog kunnen een reactie posten.