unit-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)
}
}
看来我只是在测试中再次重新实现了逻辑,这是正确的吗?如果没有,如果逻辑只是几个标志的简单组合,我怎么能想出另一个属性?
解决方案
那是不对的。
您不应该在测试期间计算预期值应该是什么,您应该知道结果应该是什么,将其设置为这样并将其与实际结果进行比较。
测试通过调用您要测试的方法并将结果与已知的预期值进行比较来工作。
"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 个吗?
现在,每种语言/框架都支持(或应该支持)矩阵类型的东西,因此您可以轻松编写每种组合的值
推荐阅读
- python - 如何在python中为plt.pcolor()设置右轴范围
- c# - 从泛型类型调用方法
- scala - 如何在 Gatling 负载测试中为多个虚拟用户使用单个 OAuth2.0 令牌
- c# - materialDesign:DialogHost 对话框在尝试从 FileOpenDialog 打开文件时关闭
- javascript - 如何复制数组的值(不指向)。切片不适合我
- php - 如何修复“无法添加外键约束”错误(字符串列)
- php - 使用php上传离子文件会注销错误文件未定义
- spring - 是否可以创建具有两个主键值的实体?
- ios - 在设置中更改应用程序名称
- asp.net-core - 如何创建在没有 IIS 的情况下启动自托管网站的 Windows 10 应用程序