什么是JavaScript单元测试的代码覆盖率的分支

What is a branch in code coverage for JavaScript unit testing

本文关键字:代码覆盖率 分支 单元测试 JavaScript 什么      更新时间:2023-09-26

我使用Istanbul来覆盖AngularJS项目中单元测试的代码。有4种类型的保险,它们是

  • 陈述
  • 分支
  • 功能
  • 线

语句、函数和行都可以,但我不明白"分支"是什么。什么是分支?

分支是运行时可以选择是否可以采用一条路径或另一条路径的地方。让我们以以下示例为例:

if(a) {
    Foo();
}
if(b) {
    Bar();
}
Yay();

当到达第一行时,它可以决定是否要进入if(a)语句的正文。此外,它可以决定不这样做。在这个阶段,我们已经看到了两条路径(一个分支)。

之后的下一句话变得更加有趣。它可以进入if体内并执行Bar .它也不能那样做。但请记住,我们以前已经有一个分支。无论是否调用Foo,结果可能会有所不同。

因此,我们最终得出了四种可能的路径:

  • 不叫Foo,也不叫Bar
  • 呼叫Foo,而不是呼叫Bar
  • 不叫Foo,叫Bar
  • 呼叫FooBar
无论

调用了Foo还是Bar,都会始终执行最后一个Yay,因此这不算作分支。所以上面的代码片段包含四个路径/两个分支(调用Foo()与否,调用Bar()与否)。

就像已经提到的其他答案一样,有许多语句可能会导致分支(if/switch )。一些(但不是全部)包括:

  • 条件循环(即 while/for/do-while
  • breakcontinue声明
  • 二进制短路运算符(即 &&/||
    • 例如。给定foo && bar,如果foofalsebar就不必被评估。同样对于foo || bar,如果footruebar也不必被评估。
  • 默认参数(即 function A(someVar = []) { ... }
    • 这是因为对此方法的调用被解释为 if -语句。对于此方法的每次调用,都会检查参数是否undefined 。如果是,则为 someVar 设置默认参数(对于上面的示例)。这会导致分支存在。

代码覆盖率工具希望确保已测试所有分支。最好是测试了所有路径,甚至所有(边缘情况)值,而不仅仅是分支。这是为了确保不执行不需要的行为。

代码可以采用多条路由的地方,即它分支。 分支语句的几个示例是 if/elseswitch 语句。

分支

覆盖范围跟踪已执行哪些分支,以便您可以确保正确测试所有路由。

来自维基百科:

是否已执行每个控制结构(例如 if 和 case 语句)的每个分支(也称为 DD 路径)?例如,给定一个 if 语句,是否同时执行了真分支和假分支?另一种说法是,程序中的每个边缘都已执行吗?

您必须针对每个控制结构测试所有可能的情况(输入/不输入if语句,例如,以及开关的所有情况)。分支覆盖率是一个指标,用于衡量(通常以百分比表示)测试覆盖的总分支数。