【问题标题】:Should I reimplement the logic in property based test?我应该在基于属性的测试中重新实现逻辑吗?
【发布时间】:2019-10-18 08:47:21
【问题描述】:

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

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

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

【问题讨论】:

  • 你可以重新实现,但我不建议这样做。相反,您应该计算出结果并对其进行硬编码。所以assertThat(actual).isEqual(true)如果它应该是真的。
  • 你能举个例子吗?在这种情况下,除了重新实现它之外,我不知道我可以使用哪些其他属性。
  • 我已经举了一个例子。我不确定你在问什么。
  • "计算结果并对其进行硬编码"
  • 这比重新实现要好,因为在某些情况下实现非常复杂,因此重新实现可能会出现错误。您不需要 8 种不同的测试;查看参数化测试。

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


【解决方案1】:

不对。

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

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

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

现在,每种语言/框架都有(或应该有)支持矩阵类型,这样您就可以轻松地编写每个组合的值

【讨论】:

  • 但是如果我的isButtonVisible of我的isButtonVisible of 4标志,那么我必须在硬编码所有16个测试用例?所以没有其他更好的选择? span>
  • 添加了更多 span>
猜你喜欢
  • 1970-01-01
  • 2017-07-26
  • 2015-08-30
  • 2011-11-19
  • 1970-01-01
  • 1970-01-01
  • 2018-06-20
  • 2011-06-01
  • 2018-02-21
相关资源
最近更新 更多