Die Leute sagen, dass "über TDD zu sprechen kaum funktioniert, wenn Sie jemanden von TDD überzeugen wollen, zeigen Sie ihm Ergebnisse". Ohne TDD bekomme ich jedoch bereits großartige Ergebnisse. Wenn ich zeige, dass Menschen, die TDD verwenden, keine guten Ergebnisse erzielen, kann ich nicht überzeugen. Ich möchte sehen, dass Menschen, die sowohl TDD als auch Nicht-TDD schreiben, mit TDD bessere Ergebnisse erzielen.
Trotz alledem bin ich daran interessiert, TDD auszuprobieren. Ich bin jedoch nicht davon überzeugt, dass ich daraus etwas gewinnen werde. Wenn es sich als nützlich erweist, werde ich versuchen, es an den Rest meines Teams weiterzuleiten.
Meine Hauptfrage lautet: Würde TDD einen Zweck für Code erfüllen, wenn ich die Korrektheit des Codes bereits nachweisen kann?
Offensichtlich ist keiner eine Silberkugel. Ihr Beweis ist möglicherweise falsch, weil Sie ein Detail übersehen haben und Ihr Test möglicherweise keinen Fehler erkennt, auf den Sie nicht getestet haben. Am Ende sind wir Menschen, niemand kann für immer 100% fehlerfreien Code erstellen. Wir können uns nur bemühen, so nah wie möglich zu kommen.
Würde TDD jedoch tatsächlich Zeit für Code sparen, dessen Richtigkeit nachgewiesen wurde? dh Code, bei dem in der Zustandsmaschine, auf der der Code ausgeführt wird, alle gültigen möglichen Zustände und ihre Bereiche vom Entwickler erkannt werden, alle berücksichtigt werden und der Code in einer Fehlerprüfung im Whitelist-Stil entworfen wird, an die jede Ausnahme übergeben wird ein oberer Handler, um sicherzustellen, dass keine unerwarteten Lecks auftreten -> ohne dass dem Client eine (innerhalb des Grundes) relevante Nachricht angezeigt und Protokollbenachrichtigungen an einen Administrator gesendet werden.
Antworten mit Beispielen aus der Praxis wären besser.
Einige Klarstellungen:
Bei dieser Frage geht es nicht darum, ob Sie die Korrektheit des Codes nachweisen können oder nicht. Nehmen wir standardmäßig an, dass nicht der gesamte Code innerhalb eines angemessenen Zeitraums als korrekt erwiesen werden kann, sondern dass einige Codeteile korrekt sein können. Zum Beispiel ist es sehr einfach, die Richtigkeit eines FizzBuzz-Moduls nachzuweisen. Für einen Cloud-basierten Datensynchronisierungsdienst nicht sehr einfach.
Innerhalb dieser Grenzen stellt die Frage Folgendes: Beginnen Sie mit der Annahme, dass eine Codebasis in zwei Teile unterteilt ist: [I] Teile, die sich als richtig erwiesen haben [II] Teile, die sich nicht als richtig erwiesen haben, aber manuell auf ihre Funktion getestet wurden.
Ich möchte TDD-Praktiken auf diese Codebasis anwenden, die sie bisher nicht hatte. Die Frage lautet wie folgt: Sollte TDD auf jedes einzelne Modul angewendet werden, oder würde es ausreichen, sie nur auf Module anzuwenden, die sich als nicht korrekt erwiesen haben?
"Bewährt richtig" bedeutet, dass Sie dieses Modul als vollständig funktional betrachten können, dh es basiert nicht auf einem globalen oder äußeren Zustand außerhalb von sich selbst und verfügt über eine vollständig eigene API für E / A, der andere Module folgen müssen, die mit ihm interagieren . Es ist nicht möglich, dieses Modul durch Ändern des Codes außerhalb des Moduls zu "beschädigen". Im schlimmsten Fall können Sie ihn missbrauchen und formatierte Fehlermeldungen erhalten.
Natürlich gibt es in jeder Regel Ausnahmen. Compiler-Fehler in neuen Compiler-Versionen können zu Fehlern in diesem Modul führen. Dieselben Fehler können jedoch auch bei Tests auftreten, die sie getestet haben, und zu einem falschen Sicherheitsgefühl bei Tests führen, die nicht mehr wie beabsichtigt funktionieren. Das Fazit ist, dass Tests keine magische Lösung sind, sondern eine weitere Schutzschicht. In dieser Frage wird die Frage erörtert, ob diese Schutzschicht im konkreten Fall eines Moduls, das sich als richtig erwiesen hat, die Mühe wert ist (nehmen Sie an, dass es war in der Tat).