安排行动断言替代方案

时间:2012-12-21 12:54:48

标签: unit-testing tdd bdd arrange-act-assert

一般问题是单元测试的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);

5 个答案:

答案 0 :(得分:9)

我喜欢的东西不是AAA的替代品,而是一种变体。我认为它是 Arrange-Assert(不是)-Act-Assert ,但其他人称之为 Guard Assertion 。这个想法是要有一个断言,确保法案的预期结果在行为之前尚未出现。对它进行了很好的讨论here

答案 1 :(得分:6)

行为驱动的开发还有另一种表示法:给定 - 何时 - 然后。对于JavaScript,c#的示例为SpecFlowJasmin。这两种资源都充满了使用这种表示法的例子。 GWT 方法通常用于行为驱动开发和面向方面编程。

答案 2 :(得分:4)

一些最早的模拟框架(至少在.Net世界中)迫使你使用Record/Replay模式。我说力量,因为我觉得它不是很自然或可读,当时没有其他选择。

这催生了一种新的隔离框架,推广AAA形式,我发现这是最具意图揭示的方法。有关此here的更多信息。

答案 3 :(得分:1)

当您使用参数化测试时,通常可以将'排列'或'给定'部分移动到参数。但是,原则仍然是

答案 4 :(得分:0)

单元测试中使用的另一种常见模式是四阶段测试模式

  1. 设置
  2. 执行
  3. 检查
  4. 拆卸
  5. 第一步与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;