布尔函数的测试用例数

时间:2017-09-17 20:37:38

标签: unit-testing testing tdd

我对用于布尔函数的测试用例数感到困惑。假设我正在写一个函数来检查某物的售价是否超过60美元。

function checkSalePrice(price) {
  return (price > 60)
}

在我的预先安置课程中,他们要求最小的测试#包括边界值。所以在这种情况下,一组示例测试是[30,60,90]。我接受的这门课程只是测试两个值,更低和更高,例如(30,90)

哪个是对的? (我知道这是在思考一杯水的深度,但我想再多做几个样本,因为我不熟悉编程)

2 个答案:

答案 0 :(得分:3)

Kent Beck写道

  

我得到的代码是有效的,而不是测试代码,所以我的理念是尽可能少地测试以达到给定的置信水平(我怀疑这种信心水平与行业标准相比很高,但这可能只是狂妄自大)。如果我通常不会犯一个错误(比如在构造函数中设置错误的变量),我不会测试它。我确实倾向于理解测试错误,所以当我有复杂条件的逻辑时我会格外小心。在团队编码时,我会修改我的策略,仔细测试我们总体上会出错的代码。

我吗?我做了栅栏贴错误。因此,我绝对希望确保我的测试套件能够捕获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建议使用以下助记符

  1. 一个
  2. 许多
  3. 大量
  4. 糟糕
  5. 布鲁斯道森指出,只有40亿个花车,所以也许你应该[全部测试]。

    请注意,那些额外的40亿减去两次检查并没有增加很多 design 值,所以我们可能已经从TDD跨越到另一个领域。

答案 1 :(得分:0)

你偶然发现了测试的大问题 - 有多少测试足够了?!

基本上有三种方式来看待这个:

  • 黑盒测试:你不关心你的MuT的内部(测试方法)。您专注于方法的合同。在你的情况下:应该在price > 60时返回true。当你想到这一点时,你会发现测试30和90 ......以及也许 60。测试角落案例是始终良好做法。所以答案是:3
  • 白盒测试:您对测试进行覆盖测量 - 例如,您可以尝试至少按一次所有路径。在这种情况下,您可以使用30和90 - 这将导致100%覆盖:所以答案在这里:2
  • 随机测试,由QuickCheck指导。这种方法非常不同:您根本没有指定测试案例。相反,您退后一步,确定应该适用于您的MuT的规则。然后框架创建随机输入并使用它来调用您的MuT - 尝试查找上述规则中断的示例。

在您的情况下,这样的规则可能是:when checkSalePrice(a) and checkSalePrice(b) then checkSalePrice(a+b)。这种方法首先感觉不寻常,但一旦开始探索它的可能性,你就可以在其中找到非常有趣的东西。特别是当您了解您的代码可以提供所需的"创建者"框架的功能。这允许您使用这种方法来测试更复杂的,面向对象的#34;东西。看到框架找到一个缺陷是很棒的 - 然后意识到框架甚至会找到最小的"破坏您指定的规则所需的示例数据。