据说语句覆盖是为了确保代码中的每条语句至少执行一次。据说
决策/分支覆盖测试决策的每个分支/输出都被测试,即两个假/真分支中的所有语句都将被执行。
但不一样吗?在语句覆盖率中,我需要执行所有语句,所以我想它只能通过运行所有可能的方式来完成。我知道我在这里遗漏了一些东西..
4 回答
Paul 的回答并不完全正确,至少我认为是这样(根据 ISTQB 的定义)。语句、决策/分支和条件覆盖之间存在相当大的差异。我将使用另一个答案中的示例,但做了一些修改,因此我可以展示所有三个测试覆盖率示例。此处编写的测试为每种类型提供了 100% 的测试覆盖率。
if(a || b)) {
test1 = true;
}
else {
if(c) {
test2 = true
}
}
我们在这里有两个语句 - if(a||b) 和 if(c),以充分解释这些覆盖率差异:
- 语句覆盖必须至少测试每个语句一次,所以我们只需要两个测试:
- a=true b=false - 这给了我们路径 if(a||b) true -> test1 = true
- a=false, b=false and c=true - 这给了我们路径:if(a||b) false -> else -> if(c) -> test2=true。
这样我们就执行了每一条语句。
分支/决策覆盖需要再进行一项测试:
- a=false, b=false, c=false - 这将我们带到第二个 if 但我们正在执行该语句的错误分支,该分支未在语句覆盖范围内执行
这样我们就测试了所有分支,这意味着我们经历了所有路径。
条件覆盖需要另一个测试:
- a=false, b=true - 通过与第一个测试相同的路径,但在 OR 语句 (a||b) 中执行另一个决定以通过它。
这样我们就测试了所有条件,这意味着我们遍历了所有路径(分支)并在每个条件下触发了它——第一个“if”语句在第一个测试中为真,因为 a=true 触发了它,而在最后一个测试中,因为b=true 触发了它。当然,有人可能会争辩说,a=true 和 b=true 的情况也应该被测试,但是当我们检查 'or' 的工作方式时,我们可以看到它是不需要的,变量 c 也可以是任何值在这些测试中,它没有被评估。
至少我是这样解释的。如果有人仍然感兴趣:)
编辑:在我最近发现的大多数来源中,决策/分支覆盖术语是等效的,我描述为决策覆盖的术语实际上是条件覆盖,因此更新了答案。
如果测试有完整的分支覆盖,那么我们可以说它也有完整的语句覆盖,但反之则不然。
100% 分支覆盖率 => 100% 语句覆盖率
100% 的语句覆盖率并不意味着 100% 的分支覆盖率
原因在于分支覆盖除了执行所有语句之外,我们还应该验证测试是否执行了所有分支,这可以解释为覆盖控制流分支中的所有边缘
if(a){
if(b){
bool statement1 = true;
}
}
a = true, b = true 将给出 100% 的语句覆盖率,但不是分支覆盖率
在分支覆盖中,我们需要覆盖所有边缘,我们在上图中以红线显示的语句覆盖中遗漏了这些边缘
好问题。我经常使用的解释是,没有 else 分支的 if 语句仍然有一个不可见的“空”else 语句:
简单的语句覆盖只是坚持所有实际存在的语句都真正执行。
分支覆盖坚持即使是不可见的 else 分支也会被执行。
没有默认情况的 switch 语句和重复直到循环也会发生类似的情况。分支覆盖要求执行默认情况,并且重复直到至少执行两次。
代码示例:
if (passwordEnteredOK()) {
enterSystem();
}
/* Invisible else part
else {
// do nothing
}
*/
通过语句覆盖,您只需检查是否使用正确的密码即可使用系统。通过分支覆盖,您还可以测试使用不正确的密码您将不会进入系统。
你可能有这样的声明:
if(a || b || (c && d && !e)) {
test1 = true;
} else {
test2 = false;
}
如果您的代码覆盖率表明 test1 和 test2 行都被命中,那么您有语句覆盖率,但要获得完整的分支覆盖率,您需要测试 a 何时为真、a 为假但 b 为真、a 和 b 为假时但 c 和 d 为真, e 为假,等等。
分支覆盖覆盖了分支选择的每一个潜在组合,因此很难实现 100% 的覆盖。