一般问题是单元测试的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);
答案 0 :(得分:9)
我喜欢的东西不是AAA的替代品,而是一种变体。我认为它是 Arrange-Assert(不是)-Act-Assert ,但其他人称之为 Guard Assertion 。这个想法是要有一个断言,确保法案的预期结果在行为之前尚未出现。对它进行了很好的讨论here。
答案 1 :(得分:6)
行为驱动的开发还有另一种表示法:给定 - 何时 - 然后。对于JavaScript,c#的示例为SpecFlow和Jasmin。这两种资源都充满了使用这种表示法的例子。 GWT 方法通常用于行为驱动开发和面向方面编程。
答案 2 :(得分:4)
一些最早的模拟框架(至少在.Net世界中)迫使你使用Record/Replay模式。我说力量,因为我觉得它不是很自然或可读,当时没有其他选择。
这催生了一种新的隔离框架,推广AAA形式,我发现这是最具意图揭示的方法。有关此here的更多信息。
答案 3 :(得分:1)
当您使用参数化测试时,通常可以将'排列'或'给定'部分移动到参数。但是,原则仍然是
答案 4 :(得分:0)
单元测试中使用的另一种常见模式是四阶段测试模式:
第一步与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;