gecko hat geschrieben:Unit-Tests != TDD
Jain, wie BlackJack schon sagte ist es Zentraler Bestandteil von TDD.
Aber davon abgesehen dreht sich der von CrackPod verlinkte Thread nicht explizit um TDD, wie man an meinen Ausführungen sehen kann.
TDD im eigentlichen Sinne ist ja erst die Tests zu schreiben und **dann** die Funktionalität zu implementieren die der Test beschreibt

Man könnte diese Art der Verwendung auch mit "Spezifikation schreiben" gleichsetzen, wo die Spezifikation für die zu implementierende Funktion/Classe von sich aus eine Validierung vornimmt, wenn man sie startet![1]
Darum geht es aber zum größten Teil nicht in dem Thread. Sondern es geht um die Vorteile von Unit tests und die explizite zunahmen von Code Andeckungstestst (=Coverage) um sich das Leben zu erleichtern(!). Besonders ist der Fokus des Threads auf Coverage gelegt, da sehr wenige sowas nutzen, was sehr schade ist, da es die einzige und "sicherste" Möglichkeit darstellt um eine 100% Abdeckung seines Codes zu erreichen.
OT:
[1]: Die Betrachtungsweise klingt im ersten Augenblick ein wenigeigenartig aber: Was ist letztendlich eine Spezifikation? Eine **ganz genaue** formalisierte Beschreibung eines zum implementierenden Systems. Ob die Spezifikation in natürliche Sprache oder in einem Programmcode (=Untit test) + Kommentaren/Docstrings Ausgedürckt wird, ist letztendlich IMO irrelevant.
Man kann durchaus sich "Utils" und eigene Syntax implementieren, die aus der auf Programmcode basierenden Spezifikation auch eine Komprimierte Form in natürlicher Sprache überführen kann. -- Dafür muss man natürlich die Toolkits ein wenig aufbohren.
----
Wie im anderen Thread erwähnt und auch dem Konsens der meisten Python-Entwicklern entspricht, sollte man das mit Python mitgelieferte ``unittest`` nicht mehr nutzen, weil es mittlerweile viel Bessere und "Pythonischere" (Ja, Leonidas nun habe ich es getan und den Begriff Pythonisch auch benutzt

) Lösungen gibt.
Gute Lösungen sind
py-test und auch
nose.
IMO sollte bei dem Thema Unit test auch das Thema Code Abdeckung (=Coverage) nicht fehlen und daher sollte man auch solche hier Aufführen:
coverage von Ned Batchelder oder das auf Ned Batchelder basierende coverage
figleaf von Titus Brown...
...wo wir auch bei deinem Unit test example angelangt sind. Die zu testende Funktion `listGap` ist schon etwas Komplizierter: Der Unit test liefert mir keine 100% Gewissheit ob wirklich alle Fälle (Die vielen Verzweigungen) abgedeckt werden. Dabei ist für mich gar nicht mal entscheidend das wirklich alle Fälle vom Unit test abgedeckt werden sollen/müssen, nein für mich ist hier das entscheidende (Bei dieser Verzweigungsreichen Funktion) zu wissen, ob da nicht toter Code rumliegt den man rausschmeißen könnte.
Ich geh mal ein wenig weiter und konstruiere mal ein Beispiel:
Angenommen deine Funktion ist vom Unit test nicht 100%ig abgedeckt, aber alle in der Funktion befindlichen Verzweigungen sind momentan erforderlich. Was passiert nun wenn du deine Funktion abänderst (Zum beispiel effizienter machst, etc.) und dadurch die nicht vom Unit test abgedeckten bereiche überflüssig werden (Sprich werden nie aufgerufen)? In dem Fall haben wir es mit unerwünschten Toten Code zu tun, toter Code den du in a**n anderen Projekten betrachten kannst, mangels Coverage und sauberen Unit tests. Klar, wenn du den Totalen Überblick hast, wirst du bei Änderung selber den Überflüssigen Code identifizieren und löschen. Aber welche Gewissheit hast du dafür, das du nicht doch was vergisst? IMO keine, da selbst Profis davor nicht gewappnet sind

Daher pädiere ich für eine gewisse "Sicherheit" die nur durch einen Abdeckungstest erreicht werden kann.
Wie gesagt, es geht mir Primär garnicht darum das deine Funktion 100% abgedeckt sein muss (Auch wenn es wünschenswerte ist und IMO nur solcher Code als potenziell "Fehlerfrei" zu betrachten ist.), sondern dass als Minimum ein Abdeckungstest hinter deinem Unit test gekoppelt wird. Es macht das schreiben von Tests halt einfacher und fehlerfreier, als wenn man das alles aus dem Stegreif macht...Und dann kann man immer noch selber entscheiden ob und in wiefern Code 100% abgedeckt werden soll.