将笑料覆盖率阈值应用于汇总报告

时间:2019-07-15 18:54:43

标签: node.js jestjs code-coverage

问题

我有一个Node项目,该项目有2个不同的jest运行,它们通过不同的npm任务执行。它们都使用相同的jest.config.js,其中有coverageThreshold的声明。我想将该阈值应用于jest运行的组合输出。

如何将玩笑覆盖率阈值应用于多个测试运行的组合输出?


背景

供参考,see the code for the sample project described below here

示例项目

为说明问题,假设项目有一个如下所示的文件:

正在测试的代码

# src/index.js

function run(cond) {
  if (cond) {
    return "foo";
  }
  return "bar";
}

module.exports = run;

项目中还有2个测试:

测试1

# src/__tests__/index.group1.test.js

var run = require("../index");

describe("when cond is true", () => {
  it("should return 'foo'", () => {
    expect(run(true)).toEqual("foo");
  });
});

测试2

# src/__tests__/index.group1.test.js

var run = require("../index");

describe("when cond is false", () => {
  it("should return 'bar'", () => {
    expect(run(false)).toEqual("bar");
  })
});

npm中的测试覆盖率package.json脚本如下:

  "test:group1:coverage": "jest --testPathPattern=group1 --coverage",
  "test:group2:coverage": "jest --testPathPattern=group2 --coverage"

运行npm run test:group1:coverage会生成:

----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |       75 |       50 |      100 |       75 |                   |
 index.js |       75 |       50 |      100 |       75 |                 5 |
----------|----------|----------|----------|----------|-------------------|

运行npm run test:group2:coverage会生成:

----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |       75 |       50 |      100 |       75 |                   |
 index.js |       75 |       50 |      100 |       75 |                 3 |
----------|----------|----------|----------|----------|-------------------|

合并覆盖率报告

Based on this post,我可以像这样单独执行npm任务...

  "test:coverage": "npm run test:group1:coverage && mv ./coverage/coverage-final.json ./coverage/coverage-group1-final.json && npm run test:group2:coverage && mv ./coverage/coverage-final.json ./coverage/coverage-group2-final.json && node ./scripts/map-coverage.js"

...以生成合并的覆盖率报告,如下所示:

----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |      100 |      100 |      100 |      100 |                   |
 index.js |      100 |      100 |      100 |      100 |                   |
----------|----------|----------|----------|----------|-------------------|

到目前为止,一切都很好。尝试将覆盖范围阈值应用于组合运行时会出现问题。

问题

现在,如果我像这样将coverageThreshold添加到jest.config.js ...

module.exports = {
  coverageThreshold: {
    global: {
        branches: 90,
        functions: 90,
        lines: 90,
        statements: 90,
    },
  },
};

...并运行npm run test:coverage,测试失败...

----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |       75 |       50 |      100 |       75 |                   |
 index.js |       75 |       50 |      100 |       75 |                 5 |
----------|----------|----------|----------|----------|-------------------|
Jest: "global" coverage threshold for statements (90%) not met: 75%
Jest: "global" coverage threshold for branches (90%) not met: 50%
Jest: "global" coverage threshold for lines (90%) not met: 75%

...,因为它首先运行group1测试,但该测试本身无法超过jest.config.js中设置的覆盖率阈值。我想对每次运行忽略此阈值,而仅将其应用于合并的报告。

注意

我知道我可以将jest.config.js文件拆分为单独的文件,并为每个测试组应用单独的覆盖阈值,但是我不想为每个测试组单独管理阈值。在所有单独的测试运行都已完成并合并之后,我想将其整体上测量/应用到项目中。

1 个答案:

答案 0 :(得分:0)

不要组合任务,只组合 pathPattern。

您可以尝试为 group1 和 group2 创建一个任务,如下所示

"test:commongroup:coverage": "jest --testPathPattern=commonGroup --coverage",

其中 commonGroup 是包含 group1 和 group2 的模式。