Du bestimmst vorher einfach, was die Funktion machen soll und was für Ergebnisse gewünscht werden (speziell auch mit Sonderfällen u.ä., bspw. 0! = 1, x^0 = 1 usw.). Deswegen schreibst du vorher die Tests und in der Implementation musst du dann nur alles richtig machen.
Wobei man so entweder schon wissen muss, wie genau man die Funktion implementieren wird, um die Spezialfälle, die man testen muss, überhaupt zu kennen. Durch einen Black Box-Test wird das nämlich nicht gewährleistet.
Mal so als Beispiel: Ich habe hier eine Art memcpy-Funktion geschrieben, weil die aus der glibc leider häufig fürchterlich lahm ist. Was da so alles für Fälle eintreten können, die getestet werden müssen:
- Länge 0 (soll natürlich direkt übersprungen werden und keine Daten verändern)
- Ziel hat 16 Byte-Alignment, Länge irgendein Vielfaches von 64. Einfachster Fall.
- Ziel hat 16 Byte-Alignment, Länge ist kleiner als 64.
- Ziel hat 16 Byte-Alignment, Länge ist größer als 64, aber kein Vielfaches von 64
- Ziel hat 16 Byte-Alignment, Länge ist kein Vielfaches von 64, aber von 16
- Ziel hat 16 Byte-Alignment, Länge ist kein Vielfaches von 64 oder 16, aber von 2.
- Ziel hat 16 Byte-Alignment, Länge ist ungerade
- Ziel hat kein 16 Byte-Alignment, Länge ist gerade und größer als die Entfernung zur nächsten 16 Byte-Grenze.
- Ziel hat kein 16 Byte-Alignment, Länge ist kleiner als die Entfernung zur nächsten 16 Byte-Grenze.
- Ziel hat kein 16 Byte-Alignment, Länge ist ungerade
Und wahrscheinlich ist diese Liste nicht einmal vollständig oder korrekt.
Das weiß man natürlich erst, wenn die Funktion fertig implementiert ist, deswegen kommt man wohl kaum darum herum, den Test zumindest im Laufe der Entwicklung anzupassen.
Zudem helfen dir Unit Tests beim sogenannten Regression Testing.
Das ist wirklich ein sehr wichtiger Punkt. Funktion ändern, Test laufen lassen und feststellen, dass
a) entweder noch alles funktioniert, wie es soll, oder
b) einem früher oder später etwas um die Ohren fliegt, was man so direkt nicht gemerkt hätte.
Wenn Tests schreiben nicht so unglaublich nervig wäre....