在测试特定条件/场景时,是否有必要检查前后结果?

时间:2014-05-07 05:55:30

标签: unit-testing tdd

我是单元测试代码,用于处理时间敏感任务的授权给具有可变小时可用性的临时工。然而,我所追求的一般答案应该独立于这种背景。

所以,我将按照这种结构进行测试:

在特定条件X下将测试任务1委托给Bob:

  1. 检查任务1 是否已委托给 Frank
  2. 创建特定条件X
  3. 测试任务1 现在被委派给 Bob
  4. 我的问题是,第1步是多余的吗?我已经有另外一个测试单独检查第1步(在没有特定条件下,任务被委托给Frank)。

    然而,添加第1步让我感到安全,我的测试实际上正在测试完全正确的事情 - 我验证结果在条件X下发生了变化。

    这是另一个更具体的例子:

    如果没有人可用,则不会委派测试任务

    1. 创建可用性,并检查任务是否已委派
    2. 删除可用性,并且不委托检查任务
    3. 再次,第1步是否过度杀伤?我已经有一个测试来测试第1步,它本身就是:

      如果有人可用,则委派测试任务

      1. 创建可用性,并检查任务是否已委派
      2. 那么,在上一个例子中重新测试那个场景是不是很愚蠢,只是做一些额外的确定?

        我最初(前段时间)认为这是一个好主意,但现在阅读我的代码,似乎有点矫枉过正。但是我想在从测试套件中删除一大堆代码之前确定一下!

        谢谢!

2 个答案:

答案 0 :(得分:3)

对于这两个例子,我不会将第一步描述为附加测试,它们断言前置条件。如果测试的前提条件对读者来说不明显,这些确实增加了价值。这可能是这样的情况:

  • 编写测试的方式意味着读者不明白这个前提条件应该适用于其余测试是否有效。在这种情况下,前置条件断言有助于使读者更清楚预期的前置条件。可能发生这种情况的一种情况是,如果您的测试数据是在设置方法中设置的,因为数据设置和测试声明之间的分离使读者更难理解测试的工作原理。

  • 您正在处理高度复杂的代码(即复杂的数学算法),其中复杂的性质意味着可能需要一段时间来调试测试失败并了解问题的原因。在这些情况下,断言您的前提条件可以极大地帮助理解测试的预期行为。

当然,除了提高可读性之外,您还可以获得如下优势:如果测试因前置条件而失败,那么将更容易理解测试失败的原因。但是,我不会仅仅因为这个原因而开始为测试添加前置条件 - 如果您需要先决条件断言只是为了帮助您了解测试失败的原因,那可能是因为您的测试过于复杂

我要补充一点,如果你以这种方式使用断言语句,我只需在它们上面添加一条注释,以便向读者清楚地表明你正在使用这个断言检查一个前置条件。

最后一点 - 这个答案仅关注单元测试。当您进入不同类型的测试(例如,运行整个软件堆栈的系统测试)时,测试可能更加脆弱,那么在测试中包含前置条件断言的论据就会变得更强。

答案 1 :(得分:1)

这就是我喜欢RSpec的原因。它有助于使这种事情变得明确。

describe 'task delegation' do
  context 'when availabilities are present' do

    before do
      # Create availabilities
    end

    it 'is assigned to person A' do
      # test the assignment'
    end

    context 'and there is a specific condition' do

      before do
        # create specific condition
      end

      it 'is assigned to person B' do
        # test the assignment
      end
    end
  end

  context 'when no availabilities are present' do
    before do
      # Do nothing
    end

    it 'is not assigned to anyone' do
      # test the lack of assignment
    end
  end
end

在写这篇文章时,我们发现了一些事情。首先,这可能不是经典测试中的单元测试。您正在测试一个类(赋值事物)与其他类(可用性)的集成。当您首次创建并删除可用性时,我可以看到进行测试的唯一原因是您不相信该集成中的某些内容。

这可能是公平的,但它并不属于集成测试。