Es ist schwierig und unrealistisch, große Scheindaten zu verwalten. Es ist noch schwieriger, wenn sich die Datenbankstruktur ändert.
Falsch.
Unit-Tests erfordern keine "großen" Scheindaten. Es sind genügend Scheindaten erforderlich, um die Szenarien zu testen, und nicht mehr.
Außerdem bitten die wirklich faulen Programmierer die Fachexperten, einfache Tabellenkalkulationen der verschiedenen Testfälle zu erstellen. Nur eine einfache Tabelle.
Dann schreibt der faule Programmierer ein einfaches Skript, um die Tabellenzeilen in Komponententestfälle umzuwandeln. Es ist wirklich ziemlich einfach.
Wenn sich das Produkt weiterentwickelt, werden die Arbeitsblätter der Testfälle aktualisiert und neue Komponententests generiert. Mach es die ganze Zeit. Es funktioniert wirklich.
Selbst mit MVVM und der Möglichkeit, die GUI zu testen, ist viel Code erforderlich, um das GUI-Szenario zu reproduzieren.
Was? "Reproduzieren"?
Der Zweck von TDD ist es, Dinge für die Testbarkeit zu entwerfen (Test Drive Development). Wenn die GUI so komplex ist, muss sie umgestaltet werden, um einfacher und testbarer zu sein. Einfacher bedeutet auch schneller, wartbarer und flexibler. Aber meistens bedeutet einfacher prüfbarer.
Ich habe die Erfahrung gemacht, dass TDD gut funktioniert, wenn Sie es auf einfache Geschäftslogik beschränken. Komplexe Geschäftslogik ist jedoch schwer zu testen, da die Anzahl der Testkombinationen (Testbereich) sehr groß ist.
Das kann wahr sein.
Es ist jedoch sehr hilfreich, die Fachexperten aufzufordern, die wichtigsten Testfälle in einer einfachen Form (wie einer Tabelle) bereitzustellen.
Die Tabellenkalkulationen können ziemlich groß werden. Aber das ist in Ordnung, da ich ein einfaches Python-Skript verwendet habe, um die Arbeitsblätter in Testfälle umzuwandeln.
Und. Ich musste einige Testfälle manuell schreiben, da die Tabellen unvollständig waren.
Jedoch. Als die Benutzer "Bugs" meldeten, fragte ich einfach, welcher Testfall in der Tabelle falsch war.
In diesem Moment korrigierten die Fachexperten entweder die Tabelle oder fügten Beispiele hinzu, um zu erklären, was passieren sollte. Die Fehlerberichte können - in vielen Fällen - eindeutig als Testfallproblem definiert werden. Meiner Erfahrung nach macht die Definition des Fehlers als fehlerhafter Testfall die Diskussion sehr viel einfacher.
Anstatt Experten zuzuhören, die versuchen, einen überkomplexen Geschäftsprozess zu erklären, müssen die Experten konkrete Beispiele für den Prozess erstellen.
TDD setzt voraus, dass die Anforderungen zu 100% korrekt sind. In solchen Fällen ist zu erwarten, dass bei der Erstellung von Tests widersprüchliche Anforderungen erfasst werden. Das Problem ist jedoch, dass dies in einem komplexen Szenario nicht der Fall ist.
Wenn Sie TDD nicht verwenden, müssen die Anforderungen unbedingt zu 100% stimmen. Einige behaupten, dass TDD unvollständige und sich ändernde Anforderungen tolerieren kann, während ein Ansatz ohne TDD nicht mit unvollständigen Anforderungen funktionieren kann.
Wenn Sie TDD nicht verwenden, wird der Widerspruch erst spät in der Implementierungsphase festgestellt.
Wenn Sie TDD verwenden, wird der Widerspruch früher festgestellt, wenn der Code einige Tests besteht und andere Tests nicht bestehen. In der Tat liefert TDD den Beweis für einen Widerspruch zu einem früheren Zeitpunkt im Prozess, lange vor der Implementierung (und Argumente während der Benutzerakzeptanztests).
Sie haben Code, der einige Tests besteht und andere nicht besteht. Sie betrachten nur diese Tests und Sie finden den Widerspruch. In der Praxis funktioniert das sehr, sehr gut, denn jetzt müssen sich die Benutzer über den Widerspruch streiten und konsistente, konkrete Beispiele für das gewünschte Verhalten liefern.