一般的问题是, 是否有替代模式,以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);
我喜欢的东西,与其说是为AAA的替代,而是一个变化。 我认为它是安排断言(不)-act断言 ,但其他人把它称为一个守卫断言 。 这个想法是有保证该法的期望的结果是不是已经在行动之前存在的断言。 有它的一个很好的讨论在这里 。
有一个从行为驱动开发另一种表示法: 鉴于 - 当 - 然后 。 对于C#示例是SpecFlow和茉莉为JavaScript。 这两种资源都充满了一些使用这个标志的例子。 GWT的方法通常是在行为驱动开发和面向方面的编程中使用。
最早的一些嘲讽框架(在.NET世界上至少)强迫你使用录制/回放模式。 我说的力量,因为我不觉得它很自然的或可读的,别无他当时的情况。
这催生了隔离框架促进AAA的形式,我觉得这是最意向揭示的方法的一个新的种族。 更多关于此这里 。
当您使用参数化测试这时往往可以移动“安排”或“给予”部分参数。 但尽管如此,原则遗体
在单元测试中使用的另一种常用的模式是第四阶段测试模式 :
- 建立
- 执行
- 校验
- 拆除
第一个步骤是基本相同的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;