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

JavaScript单元测试的代码覆盖率分支是什么,javascript,unit-testing,code-coverage,istanbul,Javascript,Unit Testing,Code Coverage,Istanbul,我用于AngularJS项目中单元测试的代码覆盖率。有4种类型的保险,分别是 声明 分支机构 作用 线 语句、函数和行都可以,但我不明白“分支”是什么。什么是分支?代码可以采用多条路径的地方,即it分支。分支语句的两个示例是if/else和switch语句 分支覆盖率跟踪已执行的分支,以便确保所有路由都已正确测试。来自: 是否已执行每个控制结构(如if和case语句)的每个分支(也称为DD路径)?例如,给定一个if语句,是否同时执行了true和false分支?另一种说法是,程序中的每一条边都

我用于AngularJS项目中单元测试的代码覆盖率。有4种类型的保险,分别是

  • 声明
  • 分支机构
  • 作用
  • 线

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

代码可以采用多条路径的地方,即it分支。分支语句的两个示例是
if
/
else
switch
语句

分支覆盖率跟踪已执行的分支,以便确保所有路由都已正确测试。

来自:

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


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

一个分支是运行时可以选择它是走一条路径还是另一条路径的地方。让我们以下面的例子为例:

if(a) {
    Foo();
}

if(b) {
    Bar();
}

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

之后的下一句话更有趣。它可以进入
if
主体并执行
。它也不能这样做。但请记住,我们以前已经有一家分店了。如果调用或未调用
Foo
,结果可能会有所不同

因此,我们得出了四条可能的路径:

  • 不调用
    Foo
    ,也不调用
    Bar
  • 调用
    Foo
    ,不调用
    Bar
  • 不调用
    Foo
    ,调用
    Bar
  • 调用
    Foo
    Bar
无论调用了
Foo
还是
Bar
,最后一个
Yay
始终被执行,因此这不算作分支。因此,上面的代码片段包含四个路径/两个分支(调用
Foo()
或不调用,调用
Bar()
或不调用)

与前面提到的其他答案一样,有许多语句可能导致分支(
if
/
开关
)。少数但并非全部包括:

  • 条件循环(即
    while
    /
    for
    /
    do while
  • break
    continue
    语句
  • 二进制短路运算符(即
    &&
    /
    | |
    • 比如说。给定
      foo和&bar
      ,如果
      foo
      false
      ,则不必计算
      bar
      。同样,对于
      foo | | bar
      ,如果
      foo
      true
      bar
      也不必进行评估
  • 默认参数(即
    函数A(someVar=[]){…}
    • 这是因为对该方法的调用被解释为
      if
      -语句。对于此方法的每次调用,如果参数
      未定义
      ,则检查该参数。如果是,则默认参数设置为
      someVar
      (如上例)。这会导致分支存在

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

谢谢你的详细回答。@Arseniy II默认参数值是如何导致分支的?这只是一个不同的值/调用。“不过我可能错了。”卡拉米利尔我只是在测试时得到了这个分支。我认为,从笑话的角度来看,这与:
让actualVar=someVar | |[]
是一样的。因此,基本上是“如果
someVar
未定义的
,则使用
[]
”。但如果您能检查一下,那就太好了:)