2012-12-21 9 views
10

Die allgemeine Frage ist Gibt es alternative Muster zu AAA für Unit-Test? Wenn ja, wäre es sehr interessant, einige Beispiele zu sehen und über ihre Vor- und Nachteile zu hören.Anordnen Act Assert Alternativen

Und als einfachstes Beispiel von AAA-Test (in C#, var aus Gründen der Einfachheit verwendet wird):

// Arranging 
var annualSalary = 120000M; 
var period = 3; // for a quarter profit 
var calc = new SalaryCalculator(); 

// Acting 
var result = calc.CalculateProfit(annualSalary, period); 

// Assertion 
Assert.IsEqual(40000, result); 

Antwort

4

Es gibt eine andere Schreibweise von Verhalten getriebene Entwicklung ist: Gegeben - Wenn - Dann. Beispiele für C# ist SpecFlow und für für JavaScript. Beide Ressourcen sind voll von Beispielen für die Verwendung dieser Notation. Der Ansatz GWT wird typischerweise in einer verhaltensorientierten Entwicklung und in der aspektorientierten Programmierung verwendet.

+3

Ich habe überprüft, um nur einige Sache über Internet und scheint wirklich wie die Vor-Wenn-Dann ist die gleiche Vereinbaren-Act-Assert (zum Beispiel [this] (http://hadihariri.com/2012/04/11/what-bdd-has-taught-me/)).Sie sehen semantisch und logisch sehr ähnlich aus. Die Implementierung unterscheidet sich jedoch dadurch, dass eine vollständig explizite attributive Testmethode verfügbar gemacht wird. Nizza :) –

9

Ich mag etwas, das nicht so sehr eine Alternative zu AAA, sondern eine Variante ist. Ich denke an es als Arrange-Assert (nicht) -Act-Assert, aber andere haben es eine Guard Assertion genannt. Die Idee ist, eine Behauptung zu haben, die sicherstellt, dass das gewünschte Ergebnis des Gesetzes nicht bereits vor der Handlung vorhanden ist. Es gibt eine gute Diskussion darüber here.

+0

Ich kann sehen, dass diese Technik nicht weit verbreitet ist. Haben Sie es jemals in einem Ihrer realen Produktionsprojekte umgesetzt? –

+0

Ich habe es benutzt, aber nicht besonders diszipliniert. Nur manchmal, wenn ich sicher sein will, dass die zu testende Handlung die Bedingung verursacht, werde ich manchmal meine Tests auf diese Weise schreiben. Nicht als normale Richtlinie. –

+0

Es ist eine interessante Idee; Ich benutze es manchmal "informell", wenn es mir wichtig ist zu klären, was die Voraussetzungen des Tests sind. – Mathias

1

Wenn Sie parametrisierte Tests verwenden, können Sie oft den Parameter 'arranging' oder 'given' an Parameter übergeben. aber immer noch, das Prinzip bleibt

4

Einige der frühesten mocking Frameworks (zumindest in der .NET-Welt) zwangen Sie, das Record/Replay Muster zu verwenden. Ich sage Kraft, weil ich es nicht sehr natürlich oder lesbar finde und es gab damals keine Alternative.

Dies führte zu einer neuen Generation von isolierten Frameworks, die die AAA-Form förderten, was meiner Meinung nach der aufschlussreichste Ansatz ist. Mehr dazu here.

+0

Schöner Schnappschuss aus der Geschichte. Ich arbeite an der .net-Plattform von der allerersten Version und ich kann mich nicht erinnern, ob ich eines dieser frühesten spöttischen Frameworks damals benutzt habe. Keines meiner Teammitglieder hat jemals damit gearbeitet. –

0

Ein weiteres gemeinsames Muster in Unit-Tests verwendet wird, ist Vier Phase-Test Pattern:

  1. Setup-
  2. Execute
  3. prüfen
  4. Teardown

Die ersten Schritte im Wesentlichen das sind wie im AAA-Muster. Allerdings finde ich das Vier-Phasen-Muster besser für Sprachen geeignet, in denen Sie nach sich selbst aufräumen müssen, zum Beispiel C oder C++. Schritt 4 (Teardown) ist, wo Sie freigegebenen Speicher freigeben oder Objekte zerstören, die Sie für den Test erstellt haben.

In Situationen, in denen Sie keinen Speicher zuweisen, oder ein Garbage Collector die Deallokation übernimmt, wird der vierte Schritt die meiste Zeit nicht verwendet, daher ist es sinnvoller, das AAA-Muster zu verwenden.

In C++, zum Beispiel könnte der obige Test sein:

// Setup 
int annualSalary = 120000; 
int period = 3; // for a quarter profit 
int result; 
SalaryCalculator calc = new SalaryCalculator(); 

// Execute 
result = calc.CalculateProfit(annualSalary, period); 

// Check 
CHECK_EQUAL(40000, result); 

// Teardown 
delete calc; 
+0

Man könnte es als Arrange-Act-Assert-Absterge bezeichnen :) Absterge war das einzige Synonym für die Reinigung, das mit einem begann, das ich finden konnte. Vielleicht könntest du ein Argument für disAssemble machen, aber das ist nur Betrug, würde ich sagen: p – Sammi