我理解单元测试的主要好处之一是,在进行关键更改时,破坏事物的代码更改非常明显。这几乎适用于所有种类的代码。它甚至似乎都适用于测试本身。我应该编写测试来测试我的测试是否成功测试?由于这本质上是递归的,我怎么知道何时停止?
答案 0 :(得分:3)
我是否应该编写测试来测试我的测试
没有。有些事情可以帮助您进行有效的测试。
如果您首先编写测试 - 因此失败,当您编写目标代码并且测试通过时 - 您知道正在测试的代码导致通过测试。
如果您以递增方式进行测试和编写,则测试会以更简单,更短的步骤发展,而这些步骤在汇总时往往是正确的。
如果有合理的覆盖范围,测试和被测代码往往会在某种程度上相互验证。如果您的测试在预期时失败并在预期时通过;如果测试具有合理的广度 - 涵盖边缘情况 - 并且它们按预期工作。
同样深度。经过良好测试"低水平/核心"代码意味着,非直观地说,高级代码可以拥有比您预期的更少和更简单的测试。
Assert
初始条件有助于确保有效的测试条件。例如Sort
例程:我将测试列表最初未排序。如果它排序后,我知道它有效。
如果您在测试失败时输出消息:"错误答案。 IsTestingUseful是' false&#39 ;,期待' false' " - 哎呀有些事情看不出来。
答案 1 :(得分:3)
测试测试有一种可能的策略:自愿在代码中引入错误并检查测试集是否检测到错误 - 此技术通常被命名为变异测试。
例如,一个框架可以修改目标代码(由单元测试测试的代码),比如改变一些+ in - 或者某些逻辑和逻辑或等等......
此策略将确定测试是否具有足够的覆盖范围,而不是测试功能,代码行,代码块或MC-DC,而是在语义上。
Smalltalk的这种框架的一个例子是MuTalk,请参阅https://code.google.com/p/mutalk/,但我很确定其他语言存在等效框架 - 请参阅维基百科页面https://en.wikipedia.org/wiki/Mutation_testing。
但是在这种情况下,你并没有真正编写测试来测试测试,你使用框架来分析测试的完整性。
答案 2 :(得分:1)
编写测试基础架构的测试可能很有价值。例如,如果我编写测试框架,我显然想验证一些关于它的断言:
等等。但是,我认为编写更高阶和更高阶的测试没有价值 - 测试通常很小,因此他们可以以一种孤立的方式验证整个系统中组件之间更复杂的交互。 / p>
我敢打赌,一般来说,识别和修复片状测试所需的程序员工作要比编写测试测试要低得多。