什么是JavaScript单元测试的代码覆盖率的分支
What is a branch in code coverage for JavaScript unit testing
我使用Istanbul来覆盖AngularJS项目中单元测试的代码。有4种类型的保险,它们是
- 陈述
- 分支
- 功能
- 线
语句、函数和行都可以,但我不明白"分支"是什么。什么是分支?
分支是运行时可以选择是否可以采用一条路径或另一条路径的地方。让我们以以下示例为例:
if(a) {
Foo();
}
if(b) {
Bar();
}
Yay();
当到达第一行时,它可以决定是否要进入if(a)
语句的正文。此外,它可以决定不这样做。在这个阶段,我们已经看到了两条路径(一个分支)。
之后的下一句话变得更加有趣。它可以进入if
体内并执行Bar
.它也不能那样做。但请记住,我们以前已经有一个分支。无论是否调用Foo
,结果可能会有所不同。
因此,我们最终得出了四种可能的路径:
- 不叫
Foo
,也不叫Bar
- 呼叫
Foo
,而不是呼叫Bar
- 不叫
Foo
,叫Bar
- 呼叫
Foo
和Bar
调用了Foo
还是Bar
,都会始终执行最后一个Yay
,因此这不算作分支。所以上面的代码片段包含四个路径/两个分支(调用Foo()
与否,调用Bar()
与否)。
就像已经提到的其他答案一样,有许多语句可能会导致分支(if
/switch
)。一些(但不是全部)包括:
- 条件循环(即
while
/for
/do-while
) break
或continue
声明- 二进制短路运算符(即
&&
/||
)- 例如。给定
foo && bar
,如果foo
是false
,bar
就不必被评估。同样对于foo || bar
,如果foo
是true
,bar
也不必被评估。
- 例如。给定
- 默认参数(即
function A(someVar = []) { ... }
)- 这是因为对此方法的调用被解释为
if
-语句。对于此方法的每次调用,都会检查参数是否undefined
。如果是,则为someVar
设置默认参数(对于上面的示例)。这会导致分支存在。
- 这是因为对此方法的调用被解释为
代码覆盖率工具希望确保已测试所有分支。最好是测试了所有路径,甚至所有(边缘情况)值,而不仅仅是分支。这是为了确保不执行不需要的行为。
代码可以采用多条路由的地方,即它分支。 分支语句的几个示例是 if
/else
和 switch
语句。
覆盖范围跟踪已执行哪些分支,以便您可以确保正确测试所有路由。
来自维基百科:
是否已执行每个控制结构(例如 if 和 case 语句)的每个分支(也称为 DD 路径)?例如,给定一个 if 语句,是否同时执行了真分支和假分支?另一种说法是,程序中的每个边缘都已执行吗?
您必须针对每个控制结构测试所有可能的情况(输入/不输入if语句,例如,以及开关的所有情况)。分支覆盖率是一个指标,用于衡量(通常以百分比表示)测试覆盖的总分支数。
- 如何在ajax请求和it上测试并获得完整的代码覆盖率's使用Jasmine和Blanket.js对jQuery
- 动态更改测试中代码覆盖率的require语句的更好方法
- 黄瓜的代码覆盖率.js
- 如何使用 Webpack 和 Babel 从 Karma 的代码覆盖率中排除规范文件
- 什么是JavaScript单元测试的代码覆盖率的分支
- 噩梦.js和代码覆盖率
- SonarQube 始终显示 Javascript 项目的 0.0% 代码覆盖率
- 角度代码覆盖率错误输出
- JavaScript 代码覆盖率
- 未获取代码覆盖率信息
- KarmaJS中具有因果报应覆盖率的代码覆盖率过高&茉莉
- 浏览器单元测试的代码覆盖率
- Jenkins/SonarQube单元测试JavaScript的代码覆盖率
- 使用通配符路径测试代码覆盖率
- 如何让声纳读取HTML格式的代码覆盖率报告
- 从Node访问伊斯坦布尔代码覆盖率信息
- 如何获得客户端JavaScript代码的代码覆盖率
- CoffeeScript代码覆盖率
- Node.js Mocha测试Restful API端点和代码覆盖率
- 代码覆盖率“未知”;使用jest 15.1.1