首页 > 解决方案 > 我应该在基于属性的测试中重新实现逻辑吗?

问题描述

假设有一个函数可以确定按钮是否应该可见。

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)
  }
}

看来我只是在测试中再次重新实现了逻辑,这是正确的吗?如果没有,如果逻辑只是几个标志的简单组合,我怎么能想出另一个属性

标签: unit-testingtestingkotlinproperty-based-testing

解决方案


那是不对的。

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

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

"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 个吗?

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


推荐阅读