Verstößt das Testen mit einer Behauptung gegen DRY?
Nein, aber es fördert Verstöße.
Trotzdem tendiert gutes objektorientiertes Design dazu, für Unit-Tests aus dem Fenster zu gehen - meistens aus gutem Grund. Es ist wichtiger, dass Komponententests voneinander isoliert sind, damit der Test isoliert abgefragt und bei Bedarf mit der Gewissheit behoben werden kann, dass Sie andere Tests nicht brechen. Grundsätzlich ist diese Testkorrektheit und Lesbarkeit wichtiger als ihre Größe oder Wartbarkeit.
Ehrlich gesagt war ich aus den von Ihnen beschriebenen Gründen noch nie ein Fan der einen Assert-per-Test-Regel: Sie führt zu einer Menge Code auf dem Boilerplate, der schwer zu lesen, leicht zu verfälschen und schwer zu reparieren ist, wenn Sie den Refactor durchführen (was Sie dazu bringt, weniger umzugestalten).
Wenn eine Funktion eine Liste von "foo" und "bar" für eine bestimmte Eingabe zurückgeben soll, ist es jedoch völlig in Ordnung, zwei Asserts zu verwenden, um zu überprüfen, ob beide in der Ergebnismenge enthalten sind. Sie geraten in Schwierigkeiten, wenn ein einzelner Test zwei Eingänge oder zwei Nebenwirkungen überprüft und Sie nicht wissen, welcher der beiden den Fehler verursacht hat.
Ich betrachte es als eine Variation des Einzelverantwortungsprinzips: Es sollte nur eines geben, das dazu führen kann, dass ein Test fehlschlägt, und in einer idealen Welt sollte diese Änderung nur einen Test brechen.
Aber am Ende ist es ein Kompromiss. Ist es wahrscheinlicher, dass Sie mehr Zeit damit verbringen, den gesamten Code zum Kopieren und Einfügen zu verwalten, oder werden Sie mehr Zeit damit verbringen, nach Ursachen zu suchen, wenn Tests durch mehrere Quellen unterbrochen werden könnten? Solange Sie einige Tests schreiben, spielt es wahrscheinlich keine Rolle. Trotz meiner Verachtung für Single-Assert-Tests neige ich dazu, mich auf die Seite weiterer Tests zu stellen. Ihr Kilometerstand kann variieren.