我对用于布尔函数的测试用例数感到困惑。假设我正在写一个函数来检查某物的售价是否超过60美元。
function checkSalePrice(price) {
return (price > 60)
}
在我的预先安置课程中,他们要求最小的测试#包括边界值。所以在这种情况下,一组示例测试是[30,60,90]。我接受的这门课程只是测试两个值,更低和更高,例如(30,90)
哪个是对的? (我知道这是在思考一杯水的深度,但我想再多做几个样本,因为我不熟悉编程)
答案 0 :(得分:3)
我得到的代码是有效的,而不是测试代码,所以我的理念是尽可能少地测试以达到给定的置信水平(我怀疑这种信心水平与行业标准相比很高,但这可能只是狂妄自大)。如果我通常不会犯一个错误(比如在构造函数中设置错误的变量),我不会测试它。我确实倾向于理解测试错误,所以当我有复杂条件的逻辑时我会格外小心。在团队编码时,我会修改我的策略,仔细测试我们总体上会出错的代码。
我吗?我做了栅栏贴错误。因此,我绝对希望确保我的测试套件能够捕获checkSalePrice
function checkSalePrice(price) {
return (price >= 60)
}
如果我使用测试驱动开发编写checkSalePrice,那么我希望通过确保它们在通过之前失败来校准我的测试。因为在我的编程环境中,一个简单的布尔函数返回false
,我的流程看起来像
assert checkSalePrice(61)
这会失败,因为默认情况下该方法返回false。然后我会实现
function checkSalePrice(price) {
return true
}
现在我的第一张支票通过,所以我知道这个边界情况正确涵盖了什么。然后我会添加一个新支票
assert ! checkSalePrice(60)
会失败。提供更正后的实现将通过检查,现在我可以根据需要自信地重构该方法。
在这里添加第三个检查任意值不会在更改代码时提供额外的安全性,也不会使下一个维护者的生活变得更容易,所以我会在这里解决两个案例。 / p>
请注意,我使用的启发式方法与返回值的复杂性无关,但与方法的complexity无关
谓词的复杂性可能包括覆盖阅读输入的各种问题。例如,如果我们传递一个集合,我们想要确保涵盖哪些案例? J.B. Rainsberger建议使用以下助记符
布鲁斯道森指出,只有40亿个花车,所以也许你应该[全部测试]。
请注意,那些额外的40亿减去两次检查并没有增加很多 design 值,所以我们可能已经从TDD跨越到另一个领域。
答案 1 :(得分:0)
你偶然发现了测试的大问题 - 有多少测试好足够了?!
基本上有三种方式来看待这个:
price > 60
时返回true。当你想到这一点时,你会发现测试30和90 ......以及也许 60。测试角落案例是始终良好做法。所以答案是:3 在您的情况下,这样的规则可能是:when checkSalePrice(a) and checkSalePrice(b) then checkSalePrice(a+b)
。这种方法首先感觉不寻常,但一旦开始探索它的可能性,你就可以在其中找到非常有趣的东西。特别是当您了解您的代码可以提供所需的"创建者"框架的功能。这允许您使用这种方法来测试更复杂的,面向对象的#34;东西。看到框架找到一个缺陷是很棒的 - 然后意识到框架甚至会找到最小的"破坏您指定的规则所需的示例数据。