当你运行jest --coverage时,Branches列的含义是什么?

pin*_*inh 10 javascript testing unit-testing reactjs jestjs

我跑了我的测试,这是我收到的:

---------------|----------|----------|----------|----------|-------------------| File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s | ---------------|----------|----------|----------|----------|-------------------| All files | 100 | 0 | 100 | 100 | | Search | 100 | 100 | 100 | 100 | | index.js | 100 | 100 | 100 | 100 | | SearchResults | 100 | 0 | 100 | 100 | | index.js | 100 | 0 | 100 | 100 | 4 | ---------------|----------|----------|----------|----------|-------------------| Test Suites: 2 passed, 2 total Tests: 5 passed, 5 total Snapshots: 1 passed, 1 total Time: 4.678s 我已经改变了一些东西,现在我在分支列上有0%,但我不知道为了改进它意味着什么.

Red*_*ury 17

条件语句创建可能无法执行的代码分支(例如if/else).此指标告诉您已执行了多少个分支.

  • 有人会认为这是在jest文档中的某处写的,但我什么都没发现...... (3认同)

Cam*_*zie 6

任何块、行、语句或语句的一部分都存在分支,在执行期间可以跳过这些分支。这可以是 if-then-else、switch-case-default 或三元运算符的结果。

有多种方法可以最终实现 100% 的线路覆盖率,但分支覆盖率却低于 100%。如果代码组织良好,最可能的解释是存在一个没有独占代码行的分支(换句话说,存在某种条件导致代码被跳过,但不运行任何备用或附加代码) 。例如,采用以下函数:

function invertIf(val,flag) {
  if (flag) {
    val = val * -1;
  }
  return val;
}
Run Code Online (Sandbox Code Playgroud)

如果使用 flag 等于 true 运行单个测试,则将评估每一行和语句(给出 100% 覆盖率),但它将实现 100% 分支覆盖率,因为存在某些行不会被执行的可能性(当 flag 等于false)并且没有针对它的测试用例。

如果每行有多个语句,则语句覆盖率可能会小于行覆盖率。在这种情况下,您还可以获得 <100% 的分支覆盖率。例如:

function isFoo(a) {
  if (a=='Foo') {return true;} else {return false;}
}
Run Code Online (Sandbox Code Playgroud)

一个测试用例将实现 100% 的行覆盖率,但不会实现 100% 的语句或分支覆盖率。尽管这可能是您的代码需要重新组织的症状。(就像一行可以有多个语句一样,一条语句也可以有多行)

还可以使用三元运算符将多个分支放入单个语句中,如下例所示:

function isBar(a) {
  return a == 'Bar' ? true : false}
}
Run Code Online (Sandbox Code Playgroud)

人们可以使用 if-then-else 编写逻辑上等效的函数,但与 if-then-else 不同,三元运算符的使用被视为具有两个分支的单个语句(如果三元运算符是嵌套的,则可以是多个分支,但如果您正在这样做那么你可能不应该使用它们)

话虽如此,我不知道如何在拥有 100% 语句覆盖率的同时获得 0% 分支覆盖率。如果执行了代码中 100% 的语句,则必须执行有限数量的分支中的至少一个分支。我最好的猜测是有一行代码是可执行的,但过于复杂或使用了一些过于深奥的东西,分析器不知道如何计算分支。在这些情况下,它可能默认为 0%,因为如果分析器无法检查分支覆盖率,则您必须手动检查分支覆盖率。然而,我无法提供任何展示这种行为的例子。