Sollten Unit-Tests im Repository gespeichert werden?

50

Ich bin ein wachsender Programmierer, der Unit-Tests für eine Bibliothek, die ich auf GitHub speichere, endlich in die Praxis umsetzt.

Mir ist der Gedanke gekommen, dass ich die Testsuiten in das Repo aufnehmen könnte, aber wenn ich mich in anderen Projekten umsehe, scheint die Aufnahme von Tests ein Glücksfall zu sein.

Wird das als schlechte Form angesehen? Ist die Idee, dass Benutzer sich nur für den Arbeitscode interessieren und ihn trotzdem in ihrem eigenen Framework testen?

Parisminton
quelle
13
Warum nicht? Tests sollten mit dem Projekt einhergehen oder sind kaum nutzlos.
61
Die Tatsache, dass einige Projekte keine Komponententests in ihr Repository aufnehmen, ist eher darauf zurückzuführen, dass diese Tests überhaupt nicht vorhanden sind.
Prasopes
4
Sie werden separat erstellt, aber ansonsten sind U-Tests eng mit Code verbunden. Um die Konsistenz zu gewährleisten, muss eine Art Abhängigkeitsmanagement vorhanden sein. Sei es, dass sie in dasselbe Repository, Subrepository oder in dieselbe versionskontrollierte "Verknüpfung" zum
Testrepository
2
@stoupa hat definitiv recht: Es wäre schön, das Beste anzunehmen, dass irgendwo ein wunderbarer Cache mit Tests versteckt ist, aber in der realen Welt sind Programmierer faul.
Cascabel
2
Beachten Sie, dass ich es für eine gute Idee halte, die Kompilierung von Testklassen in Ihrem Build-Skript zu deaktivieren.
user606723

Antworten:

119

Sie sollten Ihre Tests definitiv in das Repository stellen. Tests sind meiner Meinung nach Teil des Codes und können anderen helfen, ihn zu verstehen (wenn sie gut geschrieben sind). Außerdem können sie anderen helfen, wenn sie Ihre Codebasis ändern oder dazu beitragen. Gute Tests können Ihnen die Gewissheit geben, dass Ihre Änderungen nichts versehentlich beschädigen.

Der Testcode sollte jedoch gut vom Produktionscode getrennt sein. Maven erreicht dies zum Beispiel, indem Produktions- und Testcode in verschiedene Ordner abgelegt werden. Die Frage "Ist diese Datei Teil der Produktion oder des Testcodes?" Sollte niemals auftauchen.

Ich persönlich schreibe keine Komponententests für gebrauchte Bibliotheken in meinem eigenen Code. Ich erwarte, dass sie funktionieren (zumindest wenn ich eine Release-Version verwende, obwohl offensichtlich Fehler auftreten können). Bei Integrationstests wird eine gewisse Testabdeckung erzielt, die jedoch nicht ausreicht.

ftr
quelle
1
Schauen Sie sich als weiteres Beispiel den Testordner von ipython an . Wenn jemand es überprüft, egal wo es platziert ist, sind die relativen Links für die Tests immer noch wahr. Das Testen ist einfach. Dies ist wichtig, um festzustellen, ob Ihr neuer Entwicklungscomputer ordnungsgemäß konfiguriert ist.
Spencer Rathbun
Tests sind nicht nur Teil des Codes, sondern auch Teil der Dokumentation und häufig Teil der Spezifikation. Tests (die laufen und bestehen) sind "lebende Dokumentation".
Michael Easter
54

Wenn Sie die Komponententests nicht in den eingecheckten Quellcode aufnehmen, dann:

  • Wie kann jemand, der eine eigene Kopie dieses Codes herunterlädt und erstellt, sicherstellen, dass er wie beabsichtigt funktioniert? Compiler- und Bibliotheksfehler sind selten, und Datenfehler (insbesondere solche, die das Kompilieren des Quellcodes nicht unmöglich machen) sind noch seltener, aber sie können definitiv auftreten , insbesondere wenn Sie die Build-Umgebung nicht in dem Maße vorgeben können , wie dies der Fall ist Der Arbeitgeber kann vorschreiben, welche Werkzeuge verwendet werden.
  • Wie können Sie die Tests zurückerhalten, wenn etwas mit Ihrer lokalen Kopie des Quellcodes passiert?
  • Wie kann ein neuer Entwickler sicherstellen, dass seine Änderungen nichts an der vorhandenen Codebasis ändern?

Unterm Strich würde ich prüfen , nicht in dem offiziellen Quellcode-Repository eine sehr schlechte Sache einschließlich Unit - Tests geschrieben.

ein CVn
quelle
7

Natürlich sollten Sie Unit-Tests aus mehreren Gründen in das Repository stellen:

  • Es ist einfach, zur vorherigen Version zurückzukehren
  • andere Personen, die an dem Projekt arbeiten, erhalten ebenfalls Zugang zu Unit-Tests
  • Einige Leute betrachten Unit-Tests als Teil der Dokumentation (TDD und BDD)
BЈовић
quelle
6

Wenn die Möglichkeit besteht, sie auf einem anderen Computer auszuführen, schließen Sie sie auf jeden Fall ein. Sie sollten separat erstellt werden, damit Benutzer dies nicht müssen, und sie können zusätzliche Abhängigkeiten aufweisen, sie sollten jedoch definitiv einbezogen werden.

Ich würde stark vermuten, dass die meisten Projekte, die keine Tests in das Repository aufnehmen, einfach keine haben.

Es kann einen Grund geben, die Tests als separates Modul zu haben, damit Sie neue Tests problemlos mit älterem Code ausführen können. Dies ist nützlich für API-stabile Bibliotheks- oder Black-Box-Tests über die Befehlszeile. Der Nutzen für kompilierte Sprachen, bei denen die neuen Tests wahrscheinlich nicht mit älterem Code kompiliert werden, ist begrenzt.

Jan Hudec
quelle
5

Absolut. Die zusätzlichen Bonuspunkte liegen in der Fähigkeit, die Version X einer Quelldatei mit der Version Y eines Tests zu verfolgen. Mit anderen Worten, Sie müssen in der Lage sein, zu einer früheren Version zurückzukehren und die entsprechenden Tests für diese Version durchzuführen (im Falle einer API-Änderung oder dergleichen).

anon
quelle
3

Ich habe gerade die Lektüre "Brownfield Application Development in .Net" abgeschlossen. Hier erhalten Sie ausgezeichnete Hinweise zur Struktur einer Anwendung, einschließlich Versionskontrolle und wo / wie / warum Unit-Tests (insbesondere im Bereich Continuous Integration) vorgesehen sind. . Wenn Sie ein .NET-Entwickler sind, würde ich es empfehlen.

Seanfitzg
quelle