Frage

Wie viel sollte jeder meiner Unit-Tests untersuchen? Zum Beispiel habe ich diesen Test

[TestMethod]
public void IndexReturnsAView()
{
    IActivityRepository repository = GetPopulatedRepository();
    ActivityController activityController = GetActivityController(repository);
    ActionResult result = activityController.Index();
    Assert.IsInstanceOfType(result, typeof(ViewResult));
}

und auch

[TestMethod]
public void IndexReturnsAViewWithAListOfActivitiesInModelData()
{
    IActivityRepository repository = GetPopulatedRepository();
    ActivityController activityController = GetActivityController(repository);
    ViewResult result = activityController.Index() as ViewResult;
    Assert.IsInstanceOfType(result.ViewData.Model, typeof(List<Activity>));
}

Natürlich, wenn der erste Test versagt, dann wird so der zweite Test sollte so diese beiden mit zwei behauptet in einem Test kombiniert werden? Mein Gefühl ist, dass je mehr die Tests körnig und desto weniger jeder Test prüft desto schneller die Ursachen von Fehlern zu finden sein wird. Allerdings gibt es Kopf eine große Anzahl von sehr kleinen Tests, die Zeit in Laufen alle Tests kosten könnte.

War es hilfreich?

Lösung

Ich würde empfehlen, sie so viel wie möglich zu brechen.

Es gibt viele Gründe dafür, IMHO die wichtigsten sind:

  • Wenn eine Ihrer Tests nicht besteht, Sie wollen genau isolieren können, was falsch, so schnell ging und so sicher wie möglich. Mit jedem Test-Methode nur Test eine einzige Sache ist der beste Weg, dies zu erreichen.

  • Jeder Test muss mit einem sauberen Schiefer beginnen. Wenn Sie das Repository einmal erstellen und es dann in zwei oder mehr Tests verwenden, dann haben Sie eine implizite Abhängigkeit von der Reihenfolge dieser Tests. Sagen Sie Test1 ein Element in das Repository fügt aber vergisst, sie zu löschen. Test2 Verhalten wird nun anders, und möglicherweise dazu führen, dass Test zum Scheitern verurteilt. Die einzige Ausnahme ist, unveränderliche Daten.

Ihre Geschwindigkeit Bedenken in Bezug auf, würde mich nicht darum kümmern. Für den reinen Code-Knirschen wie diese, .NET ist sehr schnell, und Sie werden nie in der Lage sein, den Unterschied zu erkennen. Sobald Sie aus Code-Knirschen und in Dinge wie Datenbanken zu bekommen, dann werden Sie die Performance-Probleme fühlen, aber sobald Sie tun, dass Sie in allen „clean slate“ Themen wie weiter oben beschrieben, so können Sie nur haben damit zu leben (oder so viel Ihrer Daten unveränderlich wie möglich machen).

Viel Glück mit Ihrem Test.

Andere Tipps

Je feinkörniger desto besser. Wenn eine Assertion in einem Testfall ausfällt, wird der Testfall nicht weiter ausgeführt werden. Die letztgenannten Teile des Falles könnte möglicherweise andere Fehler aufzudecken.

Wenn Code zwischen Testfällen gemeinsam genutzt werden, verwenden Sie setup / Funktionen Teardown zu kümmern, dass ohne sie zu viel zu wiederholen. Zeitkosten sind oft vernachlässigbar. Wenn das Setup / Teardown zu viel Zeit in Anspruch nimmt, sind Sie wahrscheinlich nicht Unit-Tests zu tun, aber etwas höheren Niveau automatisierte Tests. Unit-Tests sollten idealerweise nicht Dateisystem, Netzwerk, Datenbank usw. Abhängigkeiten.

Ich denke, die „Standard“ Antwort ist, dass es auf den Punkt kommen soll, dass, wenn es ein Fehler im Code ist, sollte es einen Test brechen, aber alle anderen Ausfälle nicht verstecken (nicht die anderen Tests von Laufe stoppen), wenn diese ausfällt. Jeder Test prüft eine Sache und zwei Tests testen nicht das Gleiche. Das ist ein idealer, nicht immer acheivable. Nennen Sie es Führung.

Dass gesagt wird, es ist wirklich eine Kunst. Ich würde zunächst Performance-Probleme auf die Seite legen, und konzentrieren sich mehr auf die Wartbarkeit. Dort haben Sie zwei und eine halbe bis drei Zeilen Duplikation. Wenn die Design-Änderungen werden, dass bekommen schwer zu pflegen. Die Vervielfältigung per se kann durch ein Setup-Verfahren gelöst werden, eine a in der Klasse in diesem Fall eingereicht, aber die Hauptsache ist zu befürchten ist Wartbarkeit.

Die Tests sollten klein genug zu sein, um wartbar, leicht zu verstehen, und etwas, das für andere ist es sinnvoll macht (oder Sie nach der Zeit vergangen ist) zu verstehen, was der Code tut und in der Lage, die Tests zu erhalten.

Ein Unit-Test sollte genau das testen, was in Ihrem technischen Entwurf in Perspektive des funktionalen Designs beschrieben wird.

Der Ansatz auf, wie viel ein Test Test ist definitiv etwas, das Sie brauchen, Front zu entscheiden und dabei zu bleiben. Ich glaube nicht, dass jeder einheitlich den gleichen Ansatz verfolgen sollte, da verschiedene Teams und / oder Projekte unterschiedliche Prioritäten zu Codierung haben, Leistung, Fehlersuche, Testinfrastruktur, etc. Aber im Einklang zu sein werden immer helfen:

  1. schneller identifizieren Probleme, da Sie wissen im Voraus, wie tief zu graben;
  2. verbringen weniger Zeit bei der Konstruktion Ihre Tests;
  3. verwenden den gleichen Satz Testhilfsklassen während Umsetzung Tests.
  4. laufen Tests schnell genug. Nicht zu schnell und nicht zu langsam
  5. Organisation von Tests (Suiten, die Pakete, usw.)

Wenn Sie sich entscheiden, dass die Leistung wichtiger ist dann dicke Tests implementieren mit mehr Validierungen / asserttions. Wenn Sie sich entscheiden, dass zur Fehlerbehebung ein an erster Stelle steht dann die Tests so viel isolieren, wie gebraucht. Ich kann nicht sehen, warum dick und gut strukturierte Tests fehlerhaft sind. Solche Tests würden die gleiche Arbeit wie größere Menge an dünneren Tests getan und genauso gut.

Natürlich immer noch jeder Test muss auf bestimmte Funktion / Merkmal konzentrieren, aber das ist nicht wirklich Thema dieses Threads.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top