JavaScript单元测试的代码覆盖范围是什么?

时间:2016-01-27 10:37:17

标签: javascript unit-testing code-coverage istanbul

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

  • 语句
  • 分支
  • 功能
  • 线

声明,功能和线路都没问题,但我不明白"分支"是。什么是分支?

3 个答案:

答案 0 :(得分:31)

分支是运行时可以选择是否可以采用一个或另一个路径的地方。让我们举个例子:

if(a) {
    Foo();
}

if(b) {
    Bar();
}

Yay();

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

之后的下一个声明变得更有趣。它可以进入if正文并执行Bar。它也可以不这样做。但请记住,我们之前已经有了一个分支。如果调用Foo,结果可能会有所不同。

所以我们最终得到了四条可能的路径:

  • 不调用Foo,不调用Bar
  • 致电Foo,不致电Bar
  • 不致电Foo,致电Bar
  • 同时拨打FooBar

无论是Yay还是Foo,都会执行最后一次Bar,因此不会将其视为分支。因此,上面的代码段包含四个路径/两个分支(无论是否调用Foo(),还是不调用Bar())。

与已经提到的其他答案一样,有许多语句可以导致分支(if / switch)。不要忘记条件循环,例如while / for / do-while,或短路(例如&& / ||)运算符。< / p>

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

答案 1 :(得分:2)

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

分支覆盖率跟踪已执行哪些分支,因此您可以确保正确测试所有路径。

答案 2 :(得分:1)

来自Wikipedia

  

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

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