@rogerb: Leute entmutigen wirklich einfache Tests gegen die Spezifikation zu schreiben ist vielleicht nicht so hilfreich. Aber das muss ja jeder selbst wissen.
Warum muss man die Sprache dafür gut beherrschen? Man muss doch bloss Funktionen schreiben, welche die zu testende Funktion aufruft und das Ergebnis mit dem vergleicht was man erwartet. Einziger Zusatz ist erst einmal die ``assert``-Anweisung — das andere muss man sowieso können/lernen um das Programm zu schreiben. Sirius3 hat ja ein Beispiel gezeigt.
Das Schwierige bei Tests ist die Testfälle zu finden/wählen, so das möglichst alle Fälle abgedeckt sind. Aber auch darüber muss man sich auch ohne Tests Gedanken machen, denn man muss ja den Programmcode schreiben der alle möglichen Fälle abdeckt. Man kann da halt nur Glück haben, dass Fälle die man dabei nicht berücksichtigt, zufällig in den Daten nicht auftauchen, oder das Pech das sie auftauchen, man aber die fehlerhaften Daten, die daraus dann produziert werden, nicht (rechtzeitig) bemerkt.
@vbitbecks: So ganz allgemein zerlegt man das Gesamtproblem in Teilprobleme. Und diese Teilprobleme wieder in kleinere Teilprobleme. Solange bis sich die Teilprobleme mit einer Funktion mit einigen Zeilen Code gelöst werden können. Das macht man dann. Jede Funktion testet man bevor man mit der nächsten weiter macht. Aus den Teillösungen kann man dann Funktionen schreiben, die grössere Teilprobleme lösen, bis man am Ende das Gesamtproblem gelöst hat.
Ganz generell gibt es zwei bewährte ”Bruchkanten” an denen man Probleme aufteilen kann: Dort wo Daten das Programm betreten oder verlassen. Also Eingabe, Verarbeitung, und Ausgabe sind hier drei Teilprobleme die man getrennt entwickeln und testen kann. Und das andere ist das verarbeiten von Datenströmen vom verarbeiten einzelner Datensätze aus dem Strom zu trennen. Also das Umwandeln/Ergänzen aller Datensätze so zu gestalten, dass man Code schreibt der *einen* Datensatz bearbeitet, und wenn man den hat, kann man den in der Regel recht trivial in einer weiteren Teillösung verwenden um diese Funktion auf alle Datensätze anzuwenden.