调用其他功能的单元测试功能

时间:2016-08-20 10:45:24

标签: unit-testing functional-programming elixir

说我有以下两个功能:

<Style TargetType="ListView">
   <Setter Property="SelectionMode" Value="None"></Setter>
   <Setter Property="IsItemClickEnabled" Value="True" /> 
   <Setter Property="local:ListViewBehaviorAttacher.IsAttached" Value="True" />
</Style>

如您所见,add_five (number) -> number + 2 add_six (number) -> add_five(number) + 1 有一个错误。

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

想象一下,你有一个很大的函数树互相调用,很难找出哪个函数包含bug,因为所有的函数都会失败(而不仅仅是那个有错误的函数)。

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

2 个答案:

答案 0 :(得分:3)

  

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

单位测试通常会因错误的结果而失败。这就是你在断言中写的:你调用一个方法然后定义预期的结果。

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

还要考虑:

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

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

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

答案 1 :(得分:0)

据推测,您对add_five/1进行了测试,并对add_six/1进行了测试。在这种情况下,add_six/1的测试将与add_five/1的测试同时失败。

我们假设您决定先检查add_six/1。你看,这取决于add_five/1,这也是失败的。您可以立即假设add_five/1中的错误正在级联。

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

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

如果使用quickcheck样式的测试库,则可以根据您测试的属性测试某些逻辑错误。这些错误是使用随机生成的案例检测到的,这些案例会产生不正确的结果,但您作为测试人员编写的所有内容都是您正在测试的属性的库特定定义。但是,除非您嘲笑了依赖模块/功能,否则这也会受到依赖性破坏的影响。