2008-11-23 9 views
6

Ich habe ein Projekt, wo ich TDD und Unit Tests als "Software Vises" verwendet habe. Im Wesentlichen übersetze ich die Anforderungen in Tests, die sicherstellen, dass der Code den Anforderungen entspricht. Ich muss selten zurückgehen und die Komponententests bearbeiten, was eher der Punkt ist: nur der "echte" Code sollte geändert werden. Momentan gibt es 900 Einzeltests.Wie haben Sie Ihre Komponententests an veränderte Anforderungen angepasst?

Nun wurden einige Anforderungen von den Goldbesitzern geändert. Da die früheren Anforderungen in den vorhandenen Komponententests so stark verschlüsselt sind, scheint es, dass eine Änderung dieser Regeln, um sie an die neuen Anforderungen anzupassen, zu einem Desaster führen würde. Wie passen Sie Ihre Unit-Test-Suites an diese Art von Änderung an?

Antwort

2

Da die bisherigen Anforderungen sind so codiert thorougly in den bestehenden Einheit Tests, es scheint, dass sie zu an die neuen Anforderungen würde entsprechen Ändern Katastrophe einladen.

Irgendein bestimmter Grund, warum Sie so denken würden? Ich spüre etwas Angst oder ist es nur "nicht brechen, wenn es funktioniert"

Änderung passiert. In diesem Fall bedeutet es mehr Arbeitszeit-Geld. Wenn das Geschäft kein Problem damit hat, sollten Sie auch nicht (es sei denn der Zeitplan ist unmenschlich :). Wenn die Spezifikation geändert hat,

  • sicherstellen, dass die Arbeitsversion in geprüft wurde.
  • Wiederholen Sie Schritt 1 nur um sicher zu sein.
  • Scannen Sie Ihre Testsuite. Finde diejenigen, die du herausnehmen musst. Finde diejenigen, die sich ändern müssen. Finden Sie neue Tests, die Sie verstehen müssen. Verwenden Sie ein leeres Blatt Papier, um Notizen zu machen
  • Führen Sie nun einen Test nach dem anderen durch. Sofern Sie nicht das Prinzip DRY/Einmalig und nur einmal befolgt haben, sollten alle Änderungen, die Sie vornehmen müssen, an einem Ort sein. Wenn nicht, sollten Sie zuvor Refactoring haben .. aber es ist nicht zu spät .. Code in einem einzigen Ort zu extrahieren, bevor der Änderung
  • Wiederholen Sie vorherigen Schritt bis
  • getan
5

Per Definition die unit-tests replizieren nicht die Anforderungen für die Anwendung. Sie beschreiben die Anforderungen an ein Modul. Das ist ein Unterschied, das Modul kann sogar in einer Anwendung mit anderen Anforderungen wiederverwendet werden oder wird überhaupt nicht verwendet. Die sich ändernden Anforderungen wirken sich also nicht auf reale Komponententests aus (mit der Ausnahme, dass Sie für neue Module neu schreiben müssen oder alte Tests für Module beenden müssen, die für die geänderten Anforderungen nicht mehr benötigt werden).

Auf der anderen Seite: acceptance-tests befassen sich mit den Anforderungen auf Anwendungsebene. Ich denke, du sprichst von Akzeptanztests.

Ich würde die neuen Anforderungen als neue Akzeptanztest hinzufügen. Aber für die alten muss man durchschauen, wie sie durch die veränderten Anforderungen für ungültig erklärt werden.

+0

eine Abnahmeteständerung "kann" eine Lawine von Komponententeständerungen hinter seiner Implementierung bringen. Ich denke, das ist es, was das OP erreicht. – Gishu

+0

Aufgrund der sich ändernden Anforderungen können Sie Ihre Module anders verwenden und neue Funktionen oder neue Module hinzufügen. – Mnementh

4

Ich würde die neuen Tests hinzufügen und sie bestehen lassen. Dann schaust du dir an, welche Tests dadurch abgebrochen wurden. Wenn Sie glauben, dass die alten Tests im Widerspruch zu den neuen Tests stehen, müssen Sie möglicherweise die alten Tests entfernen. Andernfalls ändern Sie den Code, um auch die alten Tests zu bestehen.

2

Im Wesentlichen habe ich die Anforderungen in Tests übersetzen, die überprüfen, ob der Code den Anforderungen entspricht

Während ich mit Mnementh Antwort einverstanden sind, dies für mich ist der Schlüssel Kommentar. Wenn es sich bei den Tests um eine übersetzte Version der Anforderungen handelt, müssen sich die Tests ändern, wenn sich die Anforderungen geändert haben.

Oder sie testen für etwas, das die Anforderungen des Kunden nicht erfüllt.

Wie John Maynard Keynes gesagt haben soll: "Wenn sich die Fakten ändern, ändere ich meine Meinung. Was machst du, Sir?"

Ich denke, es gibt eine analoge Situation hier. Ihre Fakten wurden für Sie geändert

0

Ich habe zwei Antworten auf Ihre Frage, eine philosophische und die andere taktische.

Auf der philosophischen Front ist es wichtig, Ihre Unit Tests als Code zu betrachten. Das bedeutet, dass alle normalen Eigenschaften von gutem Code normalerweise für gute Tests geeignet sind: Enthüllen von Absicht, Entfernen von Duplikaten usw. Viele, vielleicht die meisten Fehler, die ich bei Komponententests gesehen habe, sind gekommen, weil die Leute ihre Tests nicht behandelt haben auf diese Weise, aber anstatt sie nur zu codieren und nie wieder zu sehen, ob sie umstrukturiert werden sollten.

Meiner Erfahrung nach, wenn Sie einen Punkt erreicht haben, an dem Ihre Komponententests ein Hindernis für Änderungen sind, liegt daran, dass Sie in Ihren Tests technische Schulden haben.

Also mein taktischer Vorschlag ist, dass bevor Sie versuchen, Ihre Anforderungen zu ändern, Sie Ihre Tests umgestalten. Jeder Test sollte einen eindeutigen Grund zum Bestehen/Nichtbestehen haben, und das Verhalten außerhalb sollte in gemeinsam genutztem Code sein. Dies bedeutet, dass für jede Verhaltensänderung gegeben Sie zwei Plätze haben, um die Tests zu ändern:

  1. Der Test, der eigentlich, dass das Verhalten
  2. die Orte, bestätigt das Verhalten in gemeinsamen Halterung Code verwendet wird

Sie könnten diesen Artikel nützlich finden: Grow Your Harness Naturally. Es ging wirklich um einen wiederverwendbaren Test-Kabelbaum für Funktionstests, aber ich finde die Ideen auch in meinen Komponententests sehr nützlich.

1

Wenn Ihre Unit-Tests nicht mehr überein Anforderungen dann sollten sie nicht da sein - schließlich sagen sie Ihnen nur, dass Ihr Code Anforderungen entspricht, die nicht mehr existieren!

Jedes Mal, wenn Sie eine Änderung in den Anforderungen haben, sollten Sie die Tests ändern, die den veränderten Anforderungen stellen und prüfen, ob der Test nicht jetzt (wheras sie vorher bestanden alle, nicht wahr;))

ändern Sie dann Ihren Quellcode so dass die neu geschriebenen Tests jetzt bestanden werden.

Verwandte Themen