Javascript 尝试使用TDD编写有意义的测试时,何时停止?

Javascript 尝试使用TDD编写有意义的测试时,何时停止?,javascript,mocha.js,tdd,chai,Javascript,Mocha.js,Tdd,Chai,我正在努力寻找何时停止使用TDD编写测试用例 假设a必须编写一个只接受某些字符串的方法,它只能接受字符串['red','green','blue'],它是必需的,不能为空 我编写第一个失败的测试,使其变为绿色,依此类推,直到我有了测试用例: it('should accept red input', () => { /*...*/ } it('should accept green input', () => { /*...*/ } it('should accept blue in

我正在努力寻找何时停止使用TDD编写测试用例

假设a必须编写一个只接受某些字符串的方法,它只能接受字符串
['red','green','blue']
,它是必需的,不能为空

我编写第一个失败的测试,使其变为绿色,依此类推,直到我有了测试用例:

it('should accept red input', () => { /*...*/ }
it('should accept green input', () => { /*...*/ }
it('should accept blue input', () => { /*...*/ }
it('should not accept null input', () => { /*...*/ }
it('should not accept empty input', () => { /*...*/ }
在这一点上,一切都通过了,现在我应该结束这一天并开始吗?或者如果紫色的
Purple
失败,我应该开始添加一个测试吗?添加此测试是否有意义? 如果是,我还可以说出其他10种颜色来测试,我也应该考虑它们吗?< /P> 这个例子很简单,但是有一些正则表达式具有无限组合的情况,我知道这可能是一个问题,我不能添加所有我能想到的时间约束测试用例。这些都是最糟糕的,因为我不知道什么时候停止编写测试代码,什么时候足够就足够了


我明白我不能得到一个具体的答案,但我想从经验中听到什么在大多数情况下都有效。

一个很好的答案是在这里发布:

简而言之,你考虑失败的可能性,并权衡写自动测试用例的成本。

在您的情况下,您可以测试另一种颜色,看看它是否正确地拒绝它。但在所有情况下进行测试都是不必要和不可能的


如果您开始接收某个值的重复错误,您可能希望将其添加到测试中。否则边界检查就可以了(空或无、行为正确、一次失败)

通常,您希望测试输入类而不是特定的输入,除非您已经知道特定的输入将产生需要测试的特定情况

在您的示例中,我将其分解为四个测试:

  • 应接受预期输入空间中的颜色,例如“红色”
  • 不应接受预期输入空间以外的颜色,例如“紫色”
  • 不应接受空输入
  • 不应接受空输入
  • 你是对的,解析输入空间很大,覆盖的案例比实际测试的要多。在这种情况下,我会考虑一些常见的情况(空/空输入、明确预期的和意外的输入等),并尝试考虑一些特定的场景,其中输入可能会被误分类为(非)预期。 可能有两种颜色“红色”和“略带红色”,您需要测试函数是否同时包含这两种颜色或其中一种颜色,而不是另一种颜色。在这种情况下,特定的颜色并不重要,只是一种颜色包含另一种颜色

    在这一点上,一切都通过了,现在我应该结束这一天,还是应该去添加一个测试,如果紫色失败了?添加此测试是否有意义?如果是,我还可以说出其他10种颜色来测试,我也应该考虑它们吗?< /P> 一种在不列举整个世界的情况下改进测试对象评估的方法是基于属性的测试。Scott Wlaschin写了一篇文章

    Kent Beck以提请注意测试和实现之间的数据复制而闻名,JB Rainsberger建议,作为“消除重复”工作的一部分,数据倾向于向测试移动。那是什么意思

    在您的例子中,听起来您可能能够将测试主题分为两部分——一部分看起来像是颜色名称的数据库(映射、查找表),另一部分是一些逻辑,在给定颜色名称数据库的情况下,它可以做一些有趣的事情

    对于后一部分,您最终会遇到这样的测试:“给定一个[red,green,blue]数据库,当输入为紫色时,测试对象是否采用that-not-a-color路径;给定一个[red,green,blue,purple]数据库,当输入为紫色时,测试对象是否采用that-is-a-color路径”

    这让你不得不担心数据库。您需要注意的是,简单地测试您是否在两个不同的位置键入了相同的数据并不是特别有价值

    你也可以从

    中考虑这个观察。 我得到的报酬是可以工作的代码,而不是测试,所以我的理念是尽可能少地测试,以达到给定的信心水平

    记住,在测试中投入的时间不是在其他地方投入的时间。有时候,正确的做法是发布代码,然后在您了解了新的代码应该如何工作后再返回代码