Frage

ich ruiniert mehrere Einheit vor einiger Zeit testet, wenn ich durchgemacht habe und Refactoring sie ihnen mehr DRY zu machen --die Absicht eines jeden Tests war nicht mehr klar. Es scheint, es ist ein Kompromiss zwischen den Tests' Lesbarkeit und Wartbarkeit. Wenn ich duplizierten Code in Unit-Tests verlassen, sind sie besser lesbar, aber dann, wenn ich das ändern SUT , ich werde jede Kopie des duplizierten Code habe aufzuspüren und zu ändern.

Stimmen Sie zu, dass dieser Trade-off existiert? Wenn ja, tun Sie es vorziehen, Ihre Tests lesbar zu sein, oder wartbar?

War es hilfreich?

Lösung

duplizierten Code ist ein Geruch in Unit-Test-Code genauso wie in anderem Code. Wenn Sie Code in Tests dupliziert haben, macht es schwieriger, den Implementierungscode Refactoring, weil Sie eine unverhältnismäßig hohe Anzahl von Tests haben zu aktualisieren. Die Tests sollten Sie mit Zuversicht helfen Refactoring, anstatt eine große Belastung sein, die Ihre Arbeit auf dem Code behindert getestet.

Wenn die Duplizierung in fixture ist eingerichtet, prüfen weitere Nutzung des setUp Verfahrens macht oder mehr bereitstellt (oder flexibleren) Creation Methoden .

Wenn die Vervielfältigung im Code ist die SUT Manipulation, dann fragen Sie sich, warum mehrere sogenannte „Einheit“ Tests genau die gleiche Funktionalität ausüben werden.

Wenn die Vervielfältigung in den Behauptungen ist, dann müssen Sie vielleicht einige Benutzerdefinierte Assertions . Zum Beispiel, wenn mehrere Tests haben eine Reihe von Behauptungen wie:

assertEqual('Joe', person.getFirstName())
assertEqual('Bloggs', person.getLastName())
assertEqual(23, person.getAge())

Dann müssen Sie vielleicht eine einzige assertPersonEqual Methode, so dass Sie assertPersonEqual(Person('Joe', 'Bloggs', 23), person) schreiben können. (Oder vielleicht müssen Sie einfach den Gleichheitsoperator auf Person zu überlasten.)

Wie Sie erwähnen, ist es wichtig, Test-Code lesbar zu sein. Insbesondere ist es wichtig, dass die Absicht einen Tests klar. Ich finde, dass, wenn viele Tests suchen meist die gleichen, (zum Beispiel drei Viertel der Linien gleich oder nahezu gleich) ist es schwer zu erkennen und die signifikanten Unterschiede zu erkennen, ohne sorgfältig zu lesen und zu vergleichen sie. So finde ich, dass Refactoring Doppelungen zu beseitigen hilft Lesbarkeit, weil jede Zeile jedes Testverfahren zum Zweck des Tests direkt relevant ist. Das ist viel hilfreicher für den Leser als eine zufällige Kombination von Linien, die direkt relevant sind, und Linien, die nur vorformulierten sind.

Wie gesagt, manchmal Tests komplexe Situationen trainieren, die ähnlich sind, aber immer noch signifikant unterschiedlich, und es ist schwer, einen guten Weg zu finden, die Doppelarbeit zu reduzieren. Verwenden Sie gesunden Menschenverstand: Wenn Sie die Tests fühlen lesbar sind und ihre Absicht deutlich machen, und Sie sind bequem mit vielleicht brauchen mehr als eine theoretisch minimalen Anzahl von Tests zu aktualisieren, wenn der Code durch die Tests aufgerufen Refactoring, nehmen dann die Unvollkommenheit und Bewegung auf etwas produktiver. Sie können immer wieder kommen und Refactoring die Tests später, als Inspiration Streiks!

Andere Tipps

Ablesbarkeit ist wichtiger für die Tests. Wenn ein Test fehlschlägt, wollen Sie das Problem offensichtlich. Der Entwickler sollte nicht durch eine Menge von stark faktorisierter Testcode waten genau zu bestimmen, was fehlgeschlagen. Sie wollen nicht Ihre Testcode so komplex geworden, dass Sie Unit-Test-Tests schreiben müssen.

Allerdings Vervielfältigung Beseitigung ist in der Regel eine gute Sache, solange es nicht dunkel etwas tut, und die Vervielfältigung in Ihren Tests beseitigen kann zu einem besseren API führen. So stellen Sie sicher, dass Sie nicht gehen, über den Punkt des abnehmenden Ertrags.

Die Umsetzung Code und Tests sind verschiedene Tiere und Factoring Regeln gelten unterschiedlich auf sie.

duplizierten Code oder Struktur ist immer ein Geruch in Implementierungscode. Wenn Sie Text beginnen bei der Umsetzung mit, müssen Sie Ihre Abstraktionen revidieren.

Auf der anderen Seite muss Testcode ein Maß an Doppelarbeit aufrechtzuerhalten. Vervielfältigung im Testcode erreicht zwei Ziele:

  • Keeping Tests entkoppelt. Übermäßige Prüfkupplung kann es schwierig machen, einen einzigen Test andernfalls zu ändern, weil der Vertrag geändert hat muss aktualisiert werden.
  • Halten Sie die Tests sinnvoll in der Isolation. Wenn ein einzelner Test versagt, muss es relativ einfach sein, um genau herauszufinden, was es Tests ist.

Ich neige dazu, so lange trivial Vervielfältigung in Test-Code zu ignorieren, da jede Testmethode bleibt kürzer als etwa 20 Zeilen. Ich mag, wenn der Setup-Lauf überprüft Rhythmus in Testmethoden erkennbar ist.

Wenn Vervielfältigung kriecht im „verifizieren“ Teil der Tests auf, es ist oft von Vorteil, benutzerdefinierte Behauptung Methoden zu definieren. Natürlich testen diese Methoden müssen noch eine deutlich erkennbare Beziehung, die in dem Methodennamen sichtbar gemacht werden kann. assertPegFitsInHole -> gut, assertPegIsGood -> schlecht

Wenn Prüfverfahren lang wachsen und sich wiederholende ich es manchmal nützlich finden fill-in-the-Rohlinge Testvorlagen zu definieren, die einige Parameter nehmen. Dann werden die tatsächlichen Testverfahren reduziert werden, um einen Aufruf der Template-Methode mit den entsprechenden Parametern.

Wie für viele Dinge in Programmieren und Testen, gibt es keine klare Antwort. Sie benötigen einen Geschmack zu entwickeln, und der beste Weg, dies zu tun ist, Fehler zu machen.

Sie können Wiederholung mit mehreren verschiedenen Geschmacksrichtungen von Testprogramm Methoden reduzieren .

Ich bin tolerante Wiederholung im Testcode als in der Produktion Code, aber ich habe durch sie manchmal frustriert worden. Wenn Sie eine Klasse-Design ändern und Sie müssen zurück und optimieren 10 verschiedene Testmethoden, die alle die gleichen Setup-Schritte zu tun, es ist frustrierend.

Ich bin damit einverstanden. Der Kompromiss besteht, unterscheidet sich jedoch an verschiedenen Orten.

Ich bin eher duplizierten Code Refactoring für staatliche Einrichtung. Aber weniger wahrscheinlich, den Teil des Tests Refactoring, die tatsächlich den Code ausübt. Das heißt, wenn immer den Code Ausübung mehrere Zeilen Code nimmt dann könnte ich denke, dass ein Geruch ist und den eigentlichen Code unter Test Refactoring. Und das wird sich verbessern die Lesbarkeit und Wartbarkeit sowohl der Code und die Tests.

Jay Felder prägte den Satz, dass "DSLs DAMP sein sollte, nicht trocken", wobei DAMP Hilfe beschreibend und bedeutungsvollen Phrasen . Ich denke, die gleichen Tests gilt auch. Offensichtlich zu viel Doppelarbeit ist schlecht. Aber unter allen Umständen Duplizierung zu entfernen, ist noch schlimmer. Die Tests sollten als Intent-enthüllt Spezifikationen handeln. Wenn Sie zum Beispiel die gleiche Funktion aus verschiedenen Winkeln angeben, eine bestimmte Menge an Vervielfältigung ist zu erwarten.

I rspec LIEBE aus diesem Grund:

Es verfügt über 2 Dinge zu helfen, -

  • shared Beispiel Gruppen für gemeinsames Verhalten zu testen.
    Sie können eine Reihe von Tests definieren, dann diesen Satz in Ihrem realen Tests.

  • 'include'
  • verschachtelte Kontexte.
    Sie können im wesentlichen eine ‚Setup‘ und ‚Teardown‘ Verfahren für eine bestimmte Teilmenge der Tests, nicht nur jeder in der Klasse.

Je früher, dass .NET / Java / andere Test-Frameworks übernehmen diese Methoden, desto besser (oder Sie IronRuby oder JRuby verwenden könnte Ihre Tests zu schreiben, die ich persönlich denke, ist die bessere Option)

Ich glaube nicht, gibt es eine Beziehung zwischen mehr dupliziert und lesbaren Code. Ich denke, Ihre Testcode sollte als ein anderer Code als gut sein. Nicht-wiederholender Code ist besser lesbar dann Code dupliziert, wenn gut gemacht.

Idealerweise Unit-Tests sollen nicht viel ändern, sobald sie geschrieben sind, so würde ich in Richtung der Lesbarkeit anlehnen.

Mit Unit-Tests als diskret wie möglich auch die Tests auf die spezifische Funktionalität fokussiert zu halten hilft, dass sie ausgerichtet sind.

Mit diesem wird gesagt, ich neige dazu, bestimmte Teile des Codes, um zu versuchen und wiederverwenden, die ich mit aufzuwickeln immer und immer wieder, wie Setup-Code, genau das gleiche über eine Reihe von Tests ist.

Ich glaube, dass Testcode ein ähnliches Niveau der Technik erfordert, die normalerweise auf Produktionscode angewendet werden würde. Es kann durchaus Argumente, die für die Lesbarkeit gemacht und ich würde zustimmen, das ist wichtig.

Nach meiner Erfahrung jedoch finde ich, dass gut einkalkuliert Tests sind leichter zu lesen und zu verstehen. Wenn es 5 Tests ist, dass jeder gleich aussehen, außer für eine Variable, und die Behauptung am Ende verändert hat, kann es sehr schwierig sein, zu finden, was der einzelne unterschiedliche Artikel ist. wenn es so einkalkuliert wird in ähnlicher Weise, dass nur die Variable, die sichtbar ist und die Behauptung ändert sich, dann ist es einfach, herauszufinden, was der Test sofort tut.

Das Finden der richtigen Abstraktionsebene bei der Prüfung schwierig sein kann, und ich glaube, es lohnt sich zu tun.

„Refactoring sie sie mehr DRY zu machen - die Absicht der einzelnen Tests war nicht mehr klar“

Es klingt wie Sie Probleme machen das Refactoring hatten. Ich kann nur raten, aber wenn es in Liquidation weniger klar, nicht, dass meinen Sie noch mehr Arbeit haben, so zu tun, dass man einigermaßen elegant Tests hat, die vollkommen klar sind?

Deshalb Tests eine Unterklasse von Unittest sind -. So können Sie gute Testsuiten entwerfen, die korrekt sind, einfach zu validieren und klar

In den alten Zeiten, die wir Werkzeuge hatten die Prüfung, die verschiedene Programmiersprachen verwendet. Es war schwer (oder unmöglich) zu entwerfen, angenehm, einfach zu Arbeit mit Tests.

Sie haben die volle Leistung - was Sprache Sie verwenden - Python, Java, C # - so dass die Sprache gut gebrauchen. Sie können gut aussehende Testcode erzielen, die klar ist und nicht zu redundant. Es gibt keinen Kompromiss.

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