Frage

Ich brauche einen Unit-Test, um sicherzustellen, ich Urlaub Stunden richtig bin zu akkumulieren. Aber Urlaub Stunden akkumulieren nach einer Geschäftsregel, wenn die Regeländerungen, dann ist die Unit-Test bricht.

Ist das akzeptabel? Soll ich die Regel durch ein Verfahren aussetzen und rufen Sie dann diese Methode sowohl von meinem Code und meinem Test, um sicherzustellen, dass das Gerät Test nicht so zerbrechlich ist?

Meine Frage ist: Was ist der richtige Weg, um Unit-Test-Geschäftsregeln, die geändert werden können

?
War es hilfreich?

Lösung

sollten Ihre Tests stellen sicher, dass der Code richtig die Geschäftsregel gehorcht. Deshalb würde ich nicht Tests schreiben, die sich um die Geschäftsregel oder verlassen sich auf die Business-Rule-Code gehen. Vielmehr, wenn die Geschäftsregel ändert, würde ich zuerst den Test ändern, um die neue Geschäftsregel zu reflektieren, dann, wenn mein Code nicht mehr den Test besteht, gehen und den Code zu beheben, so dass er den Test besteht.

Was wollen Sie nicht geschehen ist Ihr Test zu schreiben, so dass, wenn Sie, wie diese Geschäftsregel ändern angewandt wird, dass die Testpausen. Das ist leichter gesagt als getan, aber im Wesentlichen, was Sie testen möchten, ist mindestens erforderlich, um die Regel zu implementieren, ohne zu eng diktiert, wie der Code implementiert ist. Wenn das Ergebnis der Regel anders, aber dann sollten Sie den Test zuerst zu ändern sein, dann ist der Code, um es anzupassen.

Sie auch nicht wollen, den Test auf bestimmte Daten gekoppelt werden, entweder. Sprich, wenn eine Steuerberechnung zu tun, Ihr Test nicht davon ausgehen, geschrieben werden soll, dass die Klasse im Test 5% als Steuer verwendet. Stattdessen sollten Sie Ihren Test schreiben, so dass es den Steuersatz liefert, und prüft dann, dass die Berechnung korrekt durchgeführt wird. Vermutlich werden Sie eine Reihe von Werten zu testen, um sicherzustellen, dass sich auch außerhalb des zulässigen Bereichs Werte gefangen. Eine Folge davon ist, dass man ein besseres Design haben werden, da dies wird Ihnen helfen, hartcodierte Werte zu vermeiden und machen Sie Ihre Produktion Code flexibler auf Änderungen der Daten.

Andere Tipps

Ich habe ein ähnliches Setup - aber meine Geschäftsregeln erstellt werden, haben aber konfigurierbaren Optionen (verkaufen können abweichen). Wenn eine Geschäftsregel einen Kern Art und Weise ändert, in denen sie tätig ist, brechen meine Unit-Tests. Dies ist eigentlich erwartet - und gut! Es bedeutet, dass ich irgendwelche unerwarteten Wellen in meinem System isolieren kann und die Tests aktualisieren, um die Änderungen zu entsprechen.

Wenn Sie Ihre Regeln sind extern (eine Art von Skript-Sprache oder Datenbank sproc), dann müssen Sie sie in einem Integrationstest und Draht wickeln Sie Ihre Integrationstests für die automatische Ausführung auf. Obwohl es nicht mehr ein Unit-Test, sind Integrationstests ziemlich wichtig, wie gut, und Sie werden auf die gleiche Art und Weise wie Unit-Tests helfen aufgrund einer Geschäftsregeländerung unerwarteten Wellen zu verhindern.

Es klingt wie Sie Geschäftsregeln haben, und dann haben Sie Kunden dieser Geschäftsregeln. Wenn die beiden unabhängig voneinander variieren können, wäre es klug, Ihre API entsprechend zu gestalten.

Wie dargestellt, Ihre Frage klingt wie es bei entsprechender Verwendung des Strategie-Musters gelöst werden kann. diejenigen, Unit-Test in einem reinen Kontext Die Strategie stellt Ihre Geschäftsregeln, so dass Sie ohne sich Gedanken über den Client.

Wenn die Geschäftsregel ändert, kann es sinnvoller sein, einfach die alte Strategie zu verlassen, wie (falls Sie sie brauchen es später noch einmal auf) ist, und schreiben (und Unit-Test) eine völlig neue Strategie, die die neue Geschäftsregel darstellt .

Wenn Sie vollständig mit der neuen Strategie fertig sind, können Sie die Strategie in dem Client ersetzen.

Wenn das Gerät den Client testen, sollten Sie das tun gegen eine Test-Doppelstrategie (wie ein Mock oder Stub), um zu überprüfen, dass der Client korrekt mit der Strategie in Wechselwirkung tritt, ohne sich auf eine bestimmte Strategieumsetzung abhängig zu sein.

Auf diese Weise erhalten Sie eine saubere Trennung von Bedenken und halten Sie Ihre Unit-Tests wartbar. Sie gehorchen auch die Offen / Geschlossen-Prinzip.

Es klingt richtig, dass der Test nicht bestanden, wenn die Regeln geändert werden -, dass zu erwarten ist,

.

Sie können es einfacher machen, den Test in der Zukunft aufrecht zu erhalten, wenn Sie eine Datum Halterung anstelle von fest codierten Werten im Test selbst. Zum Beispiel, wenn Ihre Methode foo zurückgeben soll, können Sie das in der Halterung haben. Wenn Sie die Business-Logik zu ändern, ändern Sie einfach das Gerät und Sie müssen nicht selbst durch den Unit-Test gehen.

Natürlich hängt dies stark von der Art der Logik, die Sie testen, und nicht immer anwendbar sein kann.

Ich denke, es ist eine falsche Frage Business Rule und Unit-Test ist in verschiedenen Abstraktionsebenen. Geschäftsregel ist in der obersten Ebene der Abstraktion (Business Modelling) aber Unit-Test ist für eine Einheit von Code zu testen, die in niedrigsten Abstraktionsebene ist so Sie können nicht Unit-Test verwenden, um ein Geschäft zu validieren oder zu überprüfen, herrschen. Darüber hinaus nach der Analyse eine Geschäftsregel und Design kann auf mehrere Einheit von Codes beeinflusst so wieder Sie kann nicht Unit-Test verwenden, um zu validieren oder eine Geschäftsregel zu überprüfen. Ich glaube, Sie Testfall oder BDD Szenario verwenden können, um zu validieren und eine Geschäftsregel zu überprüfen.

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