我应该在基于属性的测试中重新实现逻辑吗?

时间:2019-06-02 15:35:16

标签: unit-testing testing kotlin property-based-testing

假设有一个确定按钮是否应该可见的功能。

fun isButtonVisible(fitlers: List<Filters>, results: List<Shop>, isLoading: Boolean) {
  return fitlers.isNotEmpty() && results.isEmpty() && !isLoading
}

现在我想使用PBT来测试此功能:

"the button should be visible if filters is not empty and results is empty and is not loading" {
  forAll { filters: List<Filters>, results: List<Shop>, isLoading: Boolean ->
    val actual = isButtonVisible(filters, results, isLoading)

    // Here reimplement the logic
    val expected = filters.isNotEmpty() && results.isEmpty() && !isLoading

    assertThat(actual).isEqual(expected)
  }
}

看来我只是在测试中再次重新实现了逻辑,这对吗?如果不是,如果逻辑只是几个标志的简单组合,我该如何提出另一个属性

1 个答案:

答案 0 :(得分:0)

那是不对的。

您不必计算测试期间的期望值,您应该知道结果是什么,将其设置为这样并将其与实际结果进行比较。

通过调用要测试的方法并将结果与​​已知的期望值进行比较来进行测试。

"the button should be visible when filters are not empty, results is empty, isLoading is false " {
  forAll { filters: List<Filters>, results: List<Shop>, isLoading: Boolean ->
    val actualVisibleFlag = isButtonVisible(filters, results, isLoading)

    val expectedVisibleFlag = true    
    assertThat(actualVisibleFlag ).isEqual(expectedVisibleFlag )
  }
}

您的期望值是已知的,这就是我要提出的重点。 对于每种输入组合,您将创建一个新测试。

这里的想法是,当您遇到错误时,可以轻松地查看哪个现有测试失败,或者可以添加新的测试来突出显示该错误。

如果您调用一个方法,要给您您认为应该得到的结果,那么您怎么知道该方法正确呢?您怎么知道它对每种组合都能正常工作?

如果减少标志的数量,您可能会减少测试次数,您真的需要4个吗?

现在,每种语言/框架都(或应该)支持矩阵式的事物,因此您可以轻松地编写每种组合的值