语句覆盖率据说可以确保代码中的每个语句至少执行一次。
决策/分支覆盖率据说是为了测试决策的每个分支/输出都经过测试,即假/真分支中的所有语句都将被执行。
但这不一样吗?在语句覆盖中,我需要执行所有语句,所以我想这只能通过运行所有可能的方式来完成。我知道我在这里错过了一些东西..
Paul 的答案不太正确,至少我这么认为(根据 ISTQB 的定义)。语句、决策/分支和条件覆盖之间存在相当大的差异。 我将使用其他答案中的示例,但对其进行一些修改,以便我可以显示所有三个测试覆盖率示例。此处编写的测试为每种类型提供 100% 的测试覆盖率。
if (a || b) {
test1 = true;
}
else {
if (c) {
test2 = true;
}
}
我们这里有两个语句 - if(a||b) 和 if(c),以充分解释这些覆盖范围差异:
这样我们就执行了每一条语句。
这样我们就测试了所有分支,这意味着我们经历了所有路径。 3. 条件覆盖率需要再次测试:
这样我们就测试了所有条件,这意味着我们遍历了所有路径(分支)并用我们可以的每个条件触发它 - 第一个“if”语句在第一个测试中为真,因为 a=true 触发了它,并且在最后一个测试中触发了它测试因为 b=true 触发了它。当然,有人可能会认为 a=true 和 b=true 的情况也应该被测试,但是当我们检查“or”如何工作时,我们可以看到它是不需要的,并且变量 c 可以是任何值,如在这些测试中,它没有被评估。
至少我是这样解释的。如果有人仍然感兴趣:)
编辑:在大多数来源中,我发现最近决策/分支覆盖术语是等效的,我描述为决策覆盖的术语实际上是条件覆盖,因此更新了答案。
好问题。我经常使用的解释是,没有 else 分支的 if 语句仍然有一个不可见的“空”else 语句:
简单的语句覆盖只是坚持所有实际存在的语句都被真正执行。
分支覆盖坚持认为即使是不可见的 else 分支也会被执行。
没有default-case的switch语句和repeat-until循环也会出现类似的情况。分支覆盖要求执行default-case,并且repeat-until至少执行两次。
代码示例:
if (passwordEnteredOK()) {
enterSystem();
}
/* Invisible else part
else {
// do nothing
}
*/
通过声明覆盖,您只需检查是否使用正确的密码即可使用系统。通过分支覆盖,您还可以测试使用不正确的密码您将无法进入系统。
您可能有这样的陈述:
if(a || b || (c && d && !e)) {
test1 = true;
} else {
test2 = false;
}
如果你的代码覆盖率表明 test1 和 test2 行都被命中,那么你就有了语句覆盖率,但是要获得完整的分支覆盖率,你需要测试何时 a 为 true、当 a 为 false 但 b 为 true 时、当 a 和 b 为 true 时假,但 c 和 d 为真,e 为假,等等
分支覆盖范围涵盖分支选择的所有潜在组合,因此更难实现 100% 覆盖。
这里的关键在于理解覆盖单位:对于语句覆盖,它们是可执行的代码行,对于决策覆盖,它们是代码中决策节点的所有可能结果。
想一想。
这就是为什么完整的决策覆盖可以保证完整的语句覆盖,但反之则不然。