So wie ich das sehe, habt ihr beide den Vorteil und seid im "Nachteil".
Der Vorteil ist, dass Sie ein System haben, mit dem Sie sich wohl fühlen und das für Sie funktioniert. Sie sind froh, dass dies die Gültigkeit Ihres Produkts bestätigt, und Sie würden wahrscheinlich keinen geschäftlichen Nutzen daraus ziehen, zu versuchen, alle Ihre Tests für etwas zu ändern, das ein anderes Framework verwendet. Wenn Sie Ihren Code umgestalten können und Ihre Tests die Änderungen übernehmen - oder noch besser, wenn Sie Ihre Tests ändern können und Ihr vorhandener Code die Tests nicht besteht, bis er umgestaltet wird, sind alle Grundlagen abgedeckt. Jedoch...
Einer der Vorteile einer gut gestalteten Unit-Testing-API besteht darin, dass die meisten modernen IDEs viel native Unterstützung bieten. Dies hat keine Auswirkungen auf das Hardcore-VI und die Emac-Benutzer, die sich über die Visual Studio-Benutzer lustig machen. Für diejenigen, die eine gute IDE verwenden, haben Sie jedoch die Möglichkeit, Ihre Tests zu debuggen und innerhalb dieser auszuführen die IDE selbst. Dies ist gut, jedoch gibt es je nach verwendetem Framework einen noch größeren Vorteil, und zwar in der Sprache, die zum Testen Ihres Codes verwendet wird.
Wenn ich Sprache sage , spreche ich nicht von einer Programmiersprache, sondern von einem umfangreichen Satz von Wörtern, die in einer fließenden Syntax zusammengefasst sind, die Testcode wie eine Geschichte lesen lässt. Insbesondere bin ich ein Verfechter der Verwendung von BDD- Frameworks geworden. Meine persönliche Lieblings-DotNet BDD- API ist StoryQEs gibt jedoch mehrere andere, die denselben grundlegenden Zweck haben: ein Konzept aus einem Anforderungsdokument herauszunehmen und es in Code zu schreiben, ähnlich wie es in der Spezifikation geschrieben ist. Die wirklich guten APIs gehen jedoch noch weiter, indem sie jede einzelne Anweisung innerhalb eines Tests abfangen und angeben, ob diese Anweisung erfolgreich ausgeführt wurde oder fehlgeschlagen ist. Dies ist unglaublich nützlich, da Sie den gesamten Test sehen können, der ausgeführt wird, ohne vorzeitig zurückzukehren. Dies bedeutet, dass Ihre Debug-Bemühungen unglaublich effizient werden, da Sie sich nur auf die Teile des Tests konzentrieren müssen, die fehlgeschlagen sind, ohne den gesamten Aufruf entschlüsseln zu müssen Sequenz. Die andere nette Sache ist, dass die Testausgabe Ihnen alle diese Informationen zeigt,
Als Beispiel für das, wovon ich spreche, vergleiche Folgendes:
Verwenden von Asserts:
Assert(variable_A == expected_value_1); // if this fails...
Assert(variable_B == expected_value_2); // ...this will not execute
Assert(variable_C == expected_value_3); // ...and nor will this!
Verwenden einer fließenden BDD-API:
(Stellen Sie sich vor, die kursiven Bits sind im Grunde Methodenzeiger.)
WithScenario("Test Scenario")
.Given(*AConfiguration*) // each method
.When(*MyMethodToTestIsCalledWith*, variable_A, variable_B, variable_C) // in the
.Then(*ExpectVariableAEquals*, expected_value_1) // Scenario will
.And(*ExpectVariableBEquals*, expected_value_2) // indicate if it has
.And(*ExpectVariableCEquals*, expected_value_3) // passed or failed execution.
.Execute();
Nun ist die BDD-Syntax zwar länger und wortreicher, und diese Beispiele sind schrecklich erfunden. Für sehr komplexe Testsituationen, in denen sich aufgrund eines bestimmten Systemverhaltens eine Menge Dinge in einem System ändern, bietet Ihnen die BDD-Syntax jedoch Klarheit Beschreibung, was Sie testen und wie Ihre Testkonfiguration definiert wurde, und Sie können diesen Code einem Nicht-Programmierer zeigen, und er wird sofort verstehen, was los ist. Wenn "variable_A" in beiden Fällen den Test nicht besteht, wird das Asserts-Beispiel erst nach dem ersten Assert ausgeführt, nachdem Sie das Problem behoben haben. Die BDD-API führt nacheinander alle in der Kette aufgerufenen Methoden aus und gibt an, welche einzelne Teile der Aussage waren fehlerhaft.
Persönlich finde ich, dass dieser Ansatz viel besser funktioniert als die herkömmlicheren xUnit-Frameworks in dem Sinne, dass die Testsprache dieselbe Sprache ist, in der Ihre Kunden über ihre logischen Anforderungen sprechen. Trotzdem habe ich es geschafft, xUnit-Frameworks in einem ähnlichen Stil zu verwenden, ohne eine vollständige Test-API erfinden zu müssen, um meine Bemühungen zu unterstützen, und obwohl die Behauptungen sich selbst effektiv kurzschließen, lesen sie sich sauberer. Zum Beispiel:
Mit Nunit :
[Test]
void TestMyMethod()
{
const int theExpectedValue = someValue;
GivenASetupToTestMyMethod();
var theActualValue = WhenIExecuteMyMethodToTest();
Assert.That(theActualValue, Is.EqualTo(theExpectedValue)); // nice, but it's not BDD
}
Wenn Sie sich für die Verwendung einer Unit-Testing-API entscheiden, empfehle ich, einige Zeit mit einer großen Anzahl verschiedener APIs zu experimentieren und Ihren Ansatz offen zu halten. Während ich persönlich für BDD eintrete, erfordern Ihre eigenen Geschäftsanforderungen möglicherweise etwas anderes für die Umstände Ihres Teams. Der Schlüssel ist jedoch zu vermeiden, dass Sie Ihr bestehendes System hinterfragen. Sie können Ihre vorhandenen Tests jederzeit mit ein paar Tests unter Verwendung einer anderen API unterstützen, aber ich würde auf keinen Fall empfehlen, einen umfangreichen Test neu zu schreiben, nur um alles gleich zu machen. Da veralteter Code nicht mehr verwendet wird, können Sie ihn und seine Tests einfach durch neuen Code und Tests mit einer alternativen API ersetzen, ohne dass Sie in einen großen Aufwand investieren müssen, der Ihnen nicht unbedingt einen echten geschäftlichen Nutzen bringt. Wie für die Verwendung einer Unit-Testing-API,