Unit testing 布尔函数的测试用例数

Unit testing 布尔函数的测试用例数,unit-testing,testing,tdd,Unit Testing,Testing,Tdd,我对布尔函数使用的测试用例的数量感到困惑。假设我正在写一个函数来检查某物的售价是否超过60美元 function checkSalePrice(price) { return (price > 60) } 在我的预科课程中,他们要求最低限度的测试包括边界值。因此,在这种情况下,一组示例测试是[30,60,90]。我参加的这门课程只测试两个值,低值和高值,例如(30,90) 哪个是正确的?(我知道这是在考虑一杯水的深度,但我想再多拿几个样本,因为我是编程新手)写道 我得到的是工作的代码

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

function checkSalePrice(price) {
  return (price > 60)
}
在我的预科课程中,他们要求最低限度的测试包括边界值。因此,在这种情况下,一组示例测试是[30,60,90]。我参加的这门课程只测试两个值,低值和高值,例如(30,90)

哪个是正确的?(我知道这是在考虑一杯水的深度,但我想再多拿几个样本,因为我是编程新手)

写道

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

我?我犯了篱笆柱错误。因此,我绝对希望确保我的测试套件能够捕获以下错误的
checkSalePrice

function checkSalePrice(price) {
    return (price >= 60)
}
如果我使用测试驱动开发编写checkSalePrice,那么我希望通过确保测试在通过之前失败来校准测试。因为在我的编程环境中,一个平凡的布尔函数返回
false
,所以我的流看起来像

assert checkSalePrice(61)
这将失败,因为该方法默认返回false。然后我会实施

function checkSalePrice(price) {
    return true
}
现在我的第一次检查通过了,所以我知道正确地涵盖了这个边界情况。然后我会添加一张新支票

assert ! checkSalePrice(60)
这将失败。提供正确的实现将通过检查,现在我可以自信地根据需要重构方法

在这里为任意值添加第三个检查不会在更改代码时提供额外的安全性,也不会使下一个维护人员的生活变得更轻松,因此我在这里只考虑两种情况

请注意,我使用的启发式与返回值的复杂性无关,而是与方法的复杂性有关

谓词的复杂性可能包括覆盖读取输入的各种问题。例如,如果我们正在传递一个集合,我们希望确保哪些案例被覆盖?建议使用以下助记符

  • 一个
  • 许多
  • 大量
  • 哎呀
  • 布鲁斯·道森(Bruce Dawson)指出,目前只有40亿股股票,所以也许你应该[测试所有股票]

    不过,请注意,这些额外的40亿减去两次检查并没有增加多少设计价值,因此我们可能已经从TDD进入了另一个领域。

    写道

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

    我?我犯了篱笆柱错误。因此,我绝对希望确保我的测试套件能够捕获以下错误的
    checkSalePrice

    function checkSalePrice(price) {
        return (price >= 60)
    }
    
    如果我使用测试驱动开发编写checkSalePrice,那么我希望通过确保测试在通过之前失败来校准测试。因为在我的编程环境中,一个平凡的布尔函数返回
    false
    ,所以我的流看起来像

    assert checkSalePrice(61)
    
    这将失败,因为该方法默认返回false。然后我会实施

    function checkSalePrice(price) {
        return true
    }
    
    现在我的第一次检查通过了,所以我知道正确地涵盖了这个边界情况。然后我会添加一张新支票

    assert ! checkSalePrice(60)
    
    这将失败。提供正确的实现将通过检查,现在我可以自信地根据需要重构方法

    在这里为任意值添加第三个检查不会在更改代码时提供额外的安全性,也不会使下一个维护人员的生活变得更轻松,因此我在这里只考虑两种情况

    请注意,我使用的启发式与返回值的复杂性无关,而是与方法的复杂性有关

    谓词的复杂性可能包括覆盖读取输入的各种问题。例如,如果我们正在传递一个集合,我们希望确保哪些案例被覆盖?建议使用以下助记符

  • 一个
  • 许多
  • 大量
  • 哎呀
  • 布鲁斯·道森(Bruce Dawson)指出,目前只有40亿股股票,所以也许你应该[测试所有股票]


    但是请注意,这些额外的40亿减去两次检查并没有增加很多设计价值,因此我们可能已经从TDD跨入了另一个领域。

    您偶然发现了测试中的一个大问题—有多少测试足够好

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

    • 黑盒测试:您不关心MuT(测试中的方法)的内部。您只关注方法的契约。在您的情况下:当
      price>60
      时应返回true。当你考虑这一点的时候,你会发现测试30和90。。。也可能是60岁。测试拐角案例始终是良好的实践。所以答案是:3
    • 白盒测试:您对您的测试进行覆盖率测量——例如,您努力至少点击一次所有路径。在这种情况下,,