Jest.js @nrwl/nx angular在一次测试运行中运行所有覆盖率测试,以在我的mono repo中获取所有覆盖的代码

yhqotfr8  于 2023-03-06  发布在  Jest
关注(0)|答案(2)|浏览(170)

我在nx angular monorepo的多个项目中运行测试,并希望获得所有项目的单个代码覆盖报告,所有代码文件都从测试中隐藏。测试运行似乎将分析的代码范围限定为当前nx项目,我没有从基础库中获得覆盖报告(用于多个项目)。这可能不是最好的做法,但我想分析,哪些代码正在使用,哪些可以重构/删除。
我已经尝试了一些解决策略,但没有一个能解决我所有的问题。
我已经扩展了所有项目的jest.config.js,并添加了覆盖率和测试报告器(目前用于Azure DevOps中发布/显示的junit & cobertura)
jest.config.js

module.exports = {
    ...
    coverageReporters: ["cobertura", "html"], 
    ...
    reporters: [
        "default",
        ["jest-junit", { outputDirectory: "coverage/libs/my-lib", outputName: "junit.xml" }]
    ],
    collectCoverageFrom: [
        "**/*.{ts,tsx}",
        "!**/node_modules/**",
        "!**/coverage/**",
        "!**/vendor/**"
    ]
};

运行所有项目

我尝试用nx run-many命令在每个应用程序和库中运行所有测试。

nx run-many --all --target=test --parallel  -- --collectCoverage --coverage

我为每个测试/覆盖率报告都设置了一个覆盖率文件夹,也许可以将它们合并到一个报告中(例如https://stackoverflow.com/a/58649061/1374945),但并不是所有的源文件都包含在内,覆盖率运行总是局限于一个项目(多个应用程序中库代码的使用没有记录)。

运行全局jest配置

第二种方法是直接运行全局jest配置并抛出jest。

node \"node_modules/jest/bin/jest.js\" -c \"jest.config.js\" --coverage --collectCoverage  --coverageReporters=html --verbose=false

我认为,这可能类似于第一种方法,因为jest也有项目配置,并独立运行每个项目。我得到一个覆盖率和测试报告,其中包含所有结果。但也没有包括所有的源文件,覆盖率运行总是在一个单一的项目范围内(来自多个应用程序的库代码的使用没有记录)。

module.exports = {
    projects: getJestProjects(),
    reporters: [
        "default",
        ["jest-junit", { outputDirectory: "coverage", outputName: "junit.xml" }],
        ["./node_modules/jest-html-reporter", {
            "pageTitle": "Test Report",
            "outputPath": "coverage/test-report.html",
            "includeConsoleLog": true,
            "includeFailureMsg": true,
            "includeSuiteFailure": true
        }]
    ],
    collectCoverageFrom: [
        "**/*.{ts,tsx}",
        "!**/node_modules/**",
        "!**/coverage/**",
        "!**/vendor/**"
    ]
};

图书馆

  • Angular 13
  • 笑话27
dpiehjr4

dpiehjr41#

对于我的用例来说,这是一个非常简单的黑客攻击, -是的,在我想出这个方法之前,我已经搜索了相当长的时间。在我们主要(前端)应用程序的jest.config.ts中,我向默认属性添加了以下内容:

projects: getJestProjects().map(
    (val: unknown) => (val as string).replace('<rootDir>', '<rootDir>/../../')
  ),

以及顶部对应的导入:

import { getJestProjects } from '@nrwl/jest';

现在,每当我运行nx run frontend:test时,它都会运行(我认为)workspace.json的项目中的所有测试。这很好,因为我们只有app.组件在app中--其他所有组件都在 libs 文件夹中。将--codeCoverage添加到这次运行中可以很好地工作。

  • libs* 文件夹中 frontend 依赖的所有组件实际上都在 libs/frontend 中--所以一旦另一个应用程序进入这个monorepo,我将只过滤带有{app,lib}/frontend/或其他内容的项目。
rxztt3cl

rxztt3cl2#

如果你能使用cobertura报告格式,你就能使用cobertura-merge库来创建一个单一的测试覆盖率报告,它将来自每个项目的单个测试覆盖率报告的结果合并成一个针对整个monorepo的报告。
首先为所有项目运行带有覆盖率报告的测试,然后运行cobertura-merge将结果报告合并为一个报告。
详细的分步说明如下:https://medium.com/hi-health-tech-blog/add-aggregated-test-coverage-to-gitlab-pipelines-with-an-nx-monorepo-cf91bc0360f7

相关问题