Reale Beispiele für mit TDD geschriebene Apps und gute Testabdeckung? [geschlossen]

17

Gibt es Open Source-Anwendungen, die mithilfe einer testgetriebenen Entwicklung entwickelt wurden und als Modell dafür dienen, wie gut Unit-Tests funktionieren sollten?

Ich würde es vorziehen, Beispiele in C # und .NET zu sehen. (Beachten Sie, dass ich Anwendungen erwähnt habe, nicht nur Bibliotheken.)

Ich bin ein mittelständischer Programmierer, der wirklich an TDD glauben und es üben möchte. Die App, an der ich in meiner täglichen Arbeit arbeite, ist ziemlich kompliziert - ungefähr 1 Million Codezeilen - und ich würde gerne mehr Unit-Tests einführen. Wir haben einige Unit-Tests durchgeführt, aber meine Bemühungen bei TDD und die Arbeit an Code, der bereits getestet wird, waren nicht ermutigend.

Nach meiner zugegebenermaßen begrenzten Erfahrung scheint TDD im Namen der Entkopplung viel Komplexität zu fördern. Die Teile der App, die schwer zu testen sind und die zufällig kritisch sind, werden an die Peripherie weitergeleitet und in den Bereich der Integrationstests verschoben, die möglicherweise jemals geschrieben wurden oder nicht. (Ich denke hier an die üblichen Verdächtigen, Dateisystemzugriff, Hydratisieren von Objekten aus einer Datenbank, asynchrone Webaufrufe usw.)

Der zu testende Code besteht in der Regel aus einer umfangreichen Zusammenarbeit zwischen Objekten und möglicherweise einer einfachen Ablauflogik, die alle im Speicher abläuft und möglicherweise einfacher und verständlicher geschrieben werden könnte, wenn nicht alles vollständig entkoppelt werden müsste zum Prüfen.

Ich verstehe die Techniken zum Verspotten von Abhängigkeiten und Ähnlichem, aber nach meiner Erfahrung führt die Verwendung von Verspotten zu sehr spröden Tests. Wenn mein erster Instinkt beim Erleben einer Reihe von Tests rot wird: "Großartig, jetzt muss ich alle Fehler beheben", dann sind meine Tests eher ein Widerstand als ein Sicherheitsnetz.

Ich versuche, diese mentale Barriere zu überwinden, und als Teil davon lese ich das Buch von Michael Feathers, Effective Working with Legacy Code . Ich hoffe es wird mir zeigen was ich vermisse.

Ich würde auch gerne einige nicht-triviale .NET-Anwendungen mit guter Codeabdeckung studieren, vielleicht ein Content-Management-System oder eine CRUD-App. Das FitNesse-Test-Framework, über das Onkel Bob spricht, werde ich mir wahrscheinlich ansehen, aber es wäre schön, etwas in der Sprache zu sehen, die ich am besten kenne.

Anregungen oder Worte der Weisheit wäre dankbar.

Josh Earl
quelle
2
Nicht ganz ... Ich bin daran interessiert, Beispiele für reale Anwendungen zu sehen. Die akzeptierte Antwort in diesem Beitrag empfiehlt einen Testrahmen. Ich habe schon einige Beispiele für Frameworks und Bibliotheken gesehen, aber das spricht meine Frage nicht an.
Josh Earl
@JoshEarl - Ich bin damit einverstanden .. Ich glaube nicht , dass meine Antwort unten würde relevant gewesen, die anderen Beitrag
hanzolo

Antworten:

14

Ich weiß nicht, ob TDD verwendet wurde, aber ein herausragendes Beispiel für Tests ist sqlite, das eine bemerkenswerte 100% ige Zweigabdeckung aufweist und mehr als 1000-mal mehr Testcode und Skripte als Produktcode enthält.

Bryan Oakley
quelle
4
Das klingt nach einer bemerkenswerten Verschwendung von Aufwand, wenn das Verhältnis von Code zu
Testcode so
6
@ Ryathal: Die Fehlerkosten bestimmen den Testaufwand, nicht die Länge des getesteten Codes. Bei einer ausreichenden Verbreitung in ausreichend unternehmenskritischen Ansätzen hätte sich das Testen möglicherweise gelohnt. Ich bin mir allerdings nicht sicher, ob SQLite es nicht übertrieben hat.
Thiton
3
sqlite ist auf jeden Fall für viele Menschen von entscheidender Bedeutung. Sie werden überrascht sein, wie oft es verwendet wird (z. B. OSX, iOS, Android OS). Und Sie müssen feststellen, dass viele dieser Testcode- und Datenzeilen wahrscheinlich maschinell generiert wurden. Eine Datenbank für industrielle Stärke enthält viele Randfälle.
Bryan Oakley
10
SQLite ist die am häufigsten verwendete SQL-Datenbank der Welt. Die Installationsbasis ist um eine Größenordnung größer als MySQL, PostgreSQL, SQL Server, Oracle und DB2 zusammen . Es ist wahrscheinlich eines der am häufigsten verwendeten Softwareprodukte. Wenn es einen Fehler in SQLite gäbe, würde jedes einzelne Smartphone auf dem Planeten nicht mehr funktionieren. Ich denke, das rechtfertigt eine kleine Paranoia.
Jörg W Mittag
@ JörgWMittag wow, das wusste ich noch nie über SQLite. Lustig. Vielen Dank. Aber 1000 mal mehr Testcode. Das ist unglaublich.
Mike Nagetier
4

Das Orchard-Projekt könnte das sein, wonach Sie suchen. Es ist eine .NET / MVC / TDD-App, die ziemlich komplex, aber nicht schlecht ist und einige bewährte Methoden und Muster demonstriert.

http://orchard.codeplex.com/wikipage?title=solution

und ich vermute mal den aktualisierten link:

http://docs.orchardproject.net/

Hanzolo
quelle
Das sieht vielversprechend aus - ich kann es kaum erwarten, mich zu vertiefen :)
Josh Earl
0

Viele Open-Source-Bibliotheken von Drittanbietern sind TDDed. Im Ruhezustand befindliche Rhinos-Bibliotheken wie RhinoMocks und NHibernate werden von ihren Entwicklern mithilfe von XUnit als Unit-Testing-Framework TDD-geprüft.

Mit OSS können Sie normalerweise nicht garantieren, dass ALLES im Produkt TDDed wurde. Die Community verfügt möglicherweise über Standards wie diese und verwendet möglicherweise sogar einen Build-Bot, der Messdaten zur Codeabdeckung ausführt. TDD ist jedoch eine Mentalität, die vom Entwickler übernommen werden muss und bei der die Öffentlichkeit in der Lage ist, sich für OpenSQL zu engagieren. Quell-VCS-Trunks wie die auf GitHub können von jedermann mit beliebiger Testabdeckung geändert werden (oder wenn eine Abdeckung erforderlich ist, könnten die Tests nachträglich geschrieben worden sein, was eine Verletzung des Geistes von TDD darstellt, aber es gibt wirklich keine eine gute Möglichkeit, es beim Festschreiben zu erwischen).

KeithS
quelle