13

一般的问题是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

5 回答 5

11

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

于 2012-12-21T15:13:40.060 回答
9

行为驱动开发还有另一种表示法:Given - When - Then。c# 的示例是SpecFlow,而Jasmin的示例是 JavaScript。这两个资源都充满了使用这种表示法的例子。GWT方法通常用于行为驱动开发和面向方面的编程。

于 2012-12-21T13:24:45.397 回答
4

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

这催生了一场新的隔离框架竞赛,促进了 AAA 形式,我认为这是最能揭示意图的方法。更多关于这里的信息。

于 2012-12-27T14:03:11.780 回答
1

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

于 2012-12-21T17:17:17.580 回答
1

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

  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;
于 2015-06-15T15:53:02.213 回答