Yapf.net

Hoe test je A+B? En hoe test je NOW()?

Hoe controleer je of een functie die botweg twee getallen bij elkaar optelt goed werkt? Ga je in een for-loop allerlei getallen invoeren en kijken of de uitkomst klopt? Ga je overflows forceren? Ga je elke mogelijke vorm van getallen aanleveren?

A+B

Het antwoord op de vraag "Hoe test je A+B" is niet anders dan voor een willekeurige andere functie: "Waarom test je het?"

Waarom test je een routine?

- Om te zien of hij doet wat hij moet doen als de omstandigheden zijn zoals je die in productie vewacht.

- Om te zien of hij op de juiste manier faalt als de omstandigheden incorrect zijn.

In het theoretische geval dat je letterlijk een functie hebt als "mijnfunc(a,b) { return a+b;}" wil je dus weten of er inderdaad a+b terugkomt. Het zou dus al volstaan om te testen of a=1, b=2 inderdaad 3 teruggeeft. (a=1, b=1 zou ook a+a of b+b kunnen teruggeven)

Maar hoe weet je dan dat dat ook goed gaat met 5463 en 3895?

Omdat die waarden ver binnen het bereik van de '+' operator vallen.

Ok, maar wat dan als je getallen invoert die groter zijn dan wat de '+' operator aan kan?

A) Als je verwacht dat je in de praktijk gaat werken met getallen die groter zijn dan wat '+' aan kan, waarom gebuik je dan '+'?

B) Je functie hoort sowiese een foutmelding te geven als de berekening niet uitgevoerd kan worden. Als de invoer groter is dan wat de '+' aankan dan hoort de functie een exception te gooien die opmerkt dat de invoer te groot is. (en ditto bij negatieve getallen)

NOW()

Het antwoord op de vraag "hoe test je now()" is bijna hetzelfde: waarom test je of je programmeertaal de juiste tijd teruggeeft? Er zijn allerlei manieren om via zaken als dependency-injection de NOW() te overloaden met iets voorspelbaars maar dan maak je je code alleen maar ingewikkelder voor de kat z'n geurige kont want NOW() gaat niet falen zonder dat de halve server crasht.
Als je perse controle wilt over de huidige tijd dan is mocking een optie, dat hoeft alleen tijdens het testen en maakt je code niet onleesbaar door allerlei afhankelijkheden te injecteren.

Dependency injection is een pattern dat een probleem oplost, denk HEEL goed na of je dat probleem wel hebt voordat je het toepast, kijk naar de ramp die Symfony heet voor een voorbeeld van hoe het niet doet, zij passen de depencendy-injection container toe die ervoor zorgt dat je nooit weet welke classes er precies worden aangeboden. Tijdens het testen kun je die inderdaad overrulen, maar dat doen ze dan weer, hoe ironisch, door de DI container te mocken.