2012-12-21 51 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