【问题标题】:Unit testing function that calls other function调用其他函数的单元测试函数
【发布时间】:2016-08-20 10:45:23
【问题描述】:

假设我有以下两个功能:

add_five (number) -> number + 2

add_six (number) -> add_five(number) + 1

如您所见,add_five 有一个错误。

如果我现在测试add_six,它会失败,因为结果不正确,但代码是正确的

假设您有一棵相互调用的函数树,很难找出哪个函数包含错误,因为所有函数都会失败(而不仅仅是有错误的函数)。

所以我的问题是:单元测试是否应该因为不正确的行为(错误的结果)或不正确的代码(错误)而失败。

【问题讨论】:

  • 没有测试可以执行魔术来检测不正确的代码。它所能做的就是检测不正确的行为。
  • 是否可以说在这种情况下单元测试并不能真正帮助发现错误?它告诉您存在无效行为,但不会直接告诉您错误在哪里。
  • 不正确的行为表明存在错误,而不是位置。

标签: unit-testing functional-programming elixir


【解决方案1】:

单元测试是否应该因为不正确的行为(错误的结果)或不正确的代码(错误)而失败?

单元测试通常会因为错误的结果而失败。这就是您在断言中所写的内容:调用方法并定义预期结果。

单元测试无法识别不正确的代码。如果操作是return number+5,并且您的 CPU 或 RAM 有硬件问题并返回不同的内容,那么即使代码正确,测试也会失败。

同时考虑:

public int add_five(int number)
{
    Thread.Sleep(5000);
    return number+5;
}

单元测试如何知道睡眠是否是有意的?

因此,如果任何单元测试失败,您的工作就是查看它,找出它失败的原因,如果它在其他方法中失败,请为该方法编写一个新的单元测试,以便您下次可以排除该方法。

【讨论】:

    【解决方案2】:

    大概你有一个add_five/1 的测试和一个add_six/1 的测试。在这种情况下,add_six/1 的测试将与add_five/1 的测试一起失败。

    假设您决定先检查add_six/1。您会看到它依赖于add_five/1,这也失败了。您可以立即假设add_five/1 中的错误正在级联。

    您的模块依赖关系形成一个有向(希望是非循环)图。如果你的函数或模块的依赖被破坏了,那应该是你首先调试的目标。

    另一种选择是在测试 add_six 函数时模拟 add_five 函数,但这很快会产生大量额外的输入和逻辑重复。如果您更改 add_five 的规范,则必须更改您将其重新实现为模拟的每个地方。

    如果您使用快速检查式测试库,则可以根据您正在测试的属性测试某些逻辑错误。这些错误是使用随机生成的会产生错误结果的案例来检测的,但作为测试人员,您所写的只是您正在测试的属性的特定于库的定义。然而,除非你已经模拟了依赖的模块/函数,否则这也会受到依赖关系破坏的影响。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-18
      • 1970-01-01
      • 1970-01-01
      • 2018-09-14
      • 1970-01-01
      相关资源
      最近更新 更多