2012-12-21 53 views
10

一般問題是是否存在用於單元測試的AAA備選模式? 如果是的話,看到一些例子並聽取他們的優點和缺點會非常有趣。排列方式作爲替代方案

而作爲AAA測試的(在C#,使用VAR爲簡單起見)最簡單的例子:

// 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); 

回答

4

有從行爲驅動開發另一個符號:鑑於 - - Then。對於JavaScript,c#的示例爲SpecFlowJasmin。這兩種資源都充滿了使用這種符號的例子。這種方法通常用於行爲驅動開發和麪向方面編程。

+3

我剛剛檢查了互聯網一些事情,真的好像鑑於-當,然後是一樣的安排,法,斷言(例如[this](http://hadihariri.com/2012/04/11/what-bdd-has-taughtme/))。它們在語義上和邏輯上看起來非常相似。但是實現的不同在於暴露了一個完全明確的歸因方式的測試。尼斯:) –

9

我喜歡的東西不是AAA的替代品,而是一種變體。我認爲它是Arrange-Assert(not)-Act-Assert,但其他人稱它爲Guard Assertion。這個想法是要有一個斷言,確保該法的預期結果在行爲之前尚未出現。有很好的討論here

+0

我可以看到這種技術沒有被廣泛使用。你有沒有把它用於你的真實世界生產項目的實踐中? –

+0

我已經使用過它,但不是以特別嚴格的方式。有時候,當我想確定被測試的行爲是什麼導致了這種情況時,有時候我會用這種方式寫我的測試。不是一個常規的政策。 –

+0

這是一個有趣的想法;當我覺得明確測試的先決條件是很重要的時候,我有時會「非正式」使用它。 – Mathias

1

當您使用參數化測試時,您經常可以將'排列'或'給定'部分移動到參數中。但仍然原則仍然

4

一些最早的嘲諷框架(在.Net世界至少)迫使你使用Record/Replay模式。我說武力是因爲我不覺得它很自然,也沒有可讀性,當時沒有其他選擇。

這催生了一個新的種族隔離框架促進AAA形式,我發現這是最有意義的揭示方法。更多關於這個here

+0

歷史上的好快照。我正在從第一個版本開始研究.net平臺,我不記得那天我是否使用過那些最早的嘲諷框架之一。我的團隊成員都沒有合作過。 –

0

在單元測試中使用的另一種常見模式是第四階段測試圖案

  1. 設置
  2. 執行
  3. 檢查
  4. 拆卸

第一步驟在本質上是與AAA模式中相同。不過,我發現四階段模式更適合於需要自行清理的語言,例如C或C++。第4步(拆卸)是釋放任何分配的內存,或銷燬爲測試創建的對象的地方。

在沒有分配任何內存或垃圾收集器負責解除分配的情況下,大部分時間都沒有使用第四步,因此使用AAA模式更有意義。

在C++中,例如,上面的測試可能是:

// 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

你可以稱它爲Arrange-Act-Assert-Absterge :) Absterge是清潔的唯一同義詞,以我能找到的一個開始。也許你可以做出贊成disAssemble的論點,但這只是作弊我會說:p – Sammi