【问题标题】:Arrange Act Assert Alternatives安排法案断言替代方案
【发布时间】:2012-12-21 12:54:48
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 我可以看到这种技术没有被广泛使用。您是否曾在您的实际生产项目中将其付诸实践?
    • 我用过它,但不是特别严格。有时当我想确定被测动作是导致条件的原因时,有时我会以这种方式编写测试。不作为常规政策。
    • 这是一个有趣的想法;当我觉得澄清测试的先决条件很重要时,我有时会“非正式地”使用它。
    • 我喜欢称它为 Assume,所以模式变成了 Arrange-Assume-Act-Assert。 (AAAA)
    【解决方案2】:

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

    【讨论】:

    • 我刚刚在 Internet 上检查了一些东西,看起来 Given-When-Then 确实是相同的 Arrange-Act-Assert(例如 this)。它们在语义和逻辑上看起来非常相似。但是实现方式不同,它公开了一种完全明确的属性测试方式。不错:)
    【解决方案3】:

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

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

    【讨论】:

    • 历史上的漂亮快照。我从第一个版本开始就在 .net 平台上工作,我不记得当时我是否使用过那些最早的模拟框架之一。我的任何一个团队成员都没有合作过。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      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;
      

      【讨论】:

      • 你可以称之为 Arrange-Act-Assert-Absterge :) Absterge 是我能找到的唯一一个以 a 开头的清洁同义词。也许你可以提出一个支持 disAssemble 的论点,但这只是作弊我会说:p
      猜你喜欢
      • 1970-01-01
      • 2016-10-03
      • 2017-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-22
      相关资源
      最近更新 更多