Frage

Ich habe damit begonnen, TDD zu verwenden. href="https://stackoverflow.com/questions/64333/what-is-the-downside-to-test-driven-development#64402"> eine frühere Frage, wie in die größte Schwierigkeit ist Umgang mit Änderungen in der Benutzeroberfläche. Wie reduzieren Sie die Auswirkungen auf Ihre Testfälle als Anforderungen ändern?

War es hilfreich?

Lösung

eine Schnittstelle ändern, muss Code zu aktualisieren, die diese Schnittstelle verwendet. Testcode ist nicht anders aus Nicht-Test-Code in dieser Hinsicht. Es ist unvermeidlich, dass die Tests für die Schnittstelle ändern müssen.

Oft, wenn eine Schnittstelle ändert Sie feststellen, dass „zu viele“ Tests durchbrechen, das heißt Tests für weitgehend unabhängig Funktionalität erweisen sich an dieser Schnittstelle abhängen. Das kann ein Zeichen dafür sein, dass Ihre Tests sind zu weit gefasst und Refactoring benötigen. Es gibt viele Möglichkeiten, dies geschehen kann, aber hier ist ein Beispiel, das hoffentlich auch als Spezialfall die allgemeine Idee zeigt.

Zum Beispiel, wenn die Art und Weise Konto Objekt zu konstruieren hat sich verändert, und dies erfordert alle oder die meisten Ihrer Tests für Ihre Order-Klasse zu aktualisieren, ist etwas nicht in Ordnung. Die meisten Ihrer Tests Bestelleinheit wahrscheinlich kümmern sich nicht um, wie ein Konto gemacht wird, so refactor Tests wie folgt aus:

def test_add_item_to_order(self):
    acct = Account('Joe', 'Bloggs')
    shipping_addr = Address('123 Elm St', 'etc' 'etc')
    order = Order(acct, shipping_addr)
    item = OrderItem('Purple Widget')
    order.addItem(item)
    self.assertEquals([item], order.items)

folgt aus:

def make_order(self):
    acct = Account('Joe', 'Bloggs')
    shipping_addr = Address('123 Elm St', 'etc' 'etc')
    return Order(acct, shipping_addr)

def make_order_item(self):
    return OrderItem('Purple Widget')

def test_add_item_to_order(self):
    order = self.make_order()
    item = self.make_order_item()
    order.addItem(item)
    self.assertEquals([item], order.items)

Dieses besondere Muster ist eine Erstellungsmethode .

Ein Vorteil hierbei ist, dass Ihre Testmethoden für den Auftrag isoliert sind aus wie Konten und Adressen erstellt werden; wenn diese Schnittstellen können Sie nur ändern, einen Ort zu ändern, anstatt jeden einzelnen Test, die Konten und Adressen zu verwenden, geschieht.

Kurz gesagt:. Tests Code sind auch, und wie alle Code, manchmal müssen sie Refactoring

Andere Tipps

I denkt Dies ist einer der Gründe für das trendige Argument, die Schnittstellen verwendet werden, zu viel.

Allerdings habe ich nicht einverstanden sind.

Wenn die Anforderungen ändern - so sollten Sie Ihre Tests. Richtig? Ich meine, wenn die Kriterien für die Sie den Test geschrieben haben, nicht mehr gültig ist, dann sollten Sie umschreiben oder diesen Test beseitigen.

Ich hoffe, das hilft, aber ich denke, dass ich Ihre Frage falsch verstanden haben.

Es wird ein Aufprall. Sie müssen einfach akzeptieren, dass die Schnittstelle zu ändern Zeit benötigen wird zunächst die zugehörigen Testfälle zu ändern. Es gibt keinen Weg, um dieses.

Doch dann betrachten Sie die Zeit, die Sie speichern versuchen, indem sie nicht einen schwer erreichbaren Fehler in dieser Schnittstelle später zu finden, und nicht, dass Fehler bei der Freigabe Woche Festsetzung es auf jeden Fall wert ist.

In TDD, sind die Tests nicht-Tests. Sie sind ausführbare Spezifikationen. IOW: sie sind eine ausführbare Codierung Ihrer Anforderungen. immer halten, dass im Auge behalten.

Jetzt plötzlich wird klar: Wenn sich Ihre Anforderungen ändern, die Tests muss ändern! Das ist der ganze Sinn der TDD!

Wenn Sie wurden Wasserfall tun, würden Sie Ihr Spezifikationsdokument ändern. In TDD haben Sie das gleiche zu tun, mit der Ausnahme, dass Ihre Spezifikation in Word nicht geschrieben wird, ist es in xUnit geschrieben.

"Was sollten wir unseren Code verhindert tun und Tests requiments Abhängigkeit? Es scheint, dass nichts. Jedes Mal, wenn requiments geändert müssen wir unseren Code & Tests ändern. Aber vielleicht können wir unsere Arbeit vereinfachen? Ja, können wir. Und das Grundprinzip ist:. Einkapselung von Code, der geändert werden kann "

http://dmitry-nikolaev.blogspot.com /2009/05/atch-your-changes.html

Sie schreiben die Tests, bevor Sie den Code für die neue Schnittstelle schreiben.

Wenn Sie den Test-First-Ansatz folgen, da in der Theorie keine Auswirkungen von Änderungen in der Benutzeroberfläche auf Ihrem Testcode soll. Nach allem, wenn Sie eine Schnittstelle ändern müssen, sollten Sie zunächst den Testfall ändern (s), um die Anforderungen zu entsprechen und dann gehen Sie vor und Ihre Schnittstellen / Implementierung ändern, bis die Tests bestehen.

Wenn Schnittstellen ändern, sollten Sie Tests erwarten zu brechen. Wenn zu viele Tests durchbrechen, bedeutet dies, dass Ihr System zu fest verbunden ist und zu viele Dinge hängen von dieser Schnittstelle. Sie sollten ein paar Tests erwarten zu brechen, aber nicht viel.

Mit Tests brechen eine gute Sache ist, jede Änderung im Code sollte Tests durchbrechen.

Wenn die Anforderungen ändern dann Ihre Tests sollten die erste Sache sein, zu ändern, anstatt die Schnittstelle.

würde ich durch Modifizieren des Interface-Designs in dem ersten geeigneten Test, die Aktualisierung die Schnittstelle beginnt den neu Bruchtest zu bestehen. Sobald die Schnittstelle aktualisiert wird, um den Test zu bestehen, sollten Sie andere Tests sehen brechen (wie sie die veraltete Schnittstelle verwenden).

Es sollte eine Frage der Aktualisierung der verbleibenden Prüfungen nicht mit dem neuen Interface-Design sein, sie wieder vorbei zu bekommen.

Aktualisieren der Schnittstelle in einem Test Driven Weise wird sichergestellt, dass die Änderungen tatsächlich notwendig sind, und sind prüfbar.

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