@nrwl/nx Angular 在一次测试运行中运行所有覆盖率测试,以获取我的 mono 存储库中的所有覆盖代码

Ric*_*ann 10 code-coverage jestjs monorepo angular nrwl-nx

我正在我的 nx Angular monorepo 的多个项目中运行测试,并且希望获得所有项目的单个代码覆盖率报告,其中所有代码文件都从测试中隐藏。测试运行似乎将分析的代码范围限制到当前的 nx 项目,并且我没有从基础库(从多个项目使用)获取覆盖率报告。这可能不是最佳实践,但我想分析哪些代码正在使用以及哪些代码可以重构/删除。

我已经尝试过一些解决策略,但没有一个能够解决我的所有问题。

我扩展了所有项目的 jest.config.js 并添加了覆盖范围和测试报告器(目前用于在 Azure DevOps 中发布/显示的 junit 和 cobertura)

笑话配置.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/**"
    ]
};

Run Code Online (Sandbox Code Playgroud)

运行所有项目

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

nx run-many --all --target=test --parallel  -- --collectCoverage --coverage
Run Code Online (Sandbox Code Playgroud)

我为每个测试/覆盖率报告提供了一个覆盖率文件夹,并且可能能够将它们合并到一个报告中(例如/sf/answers/4105434301/)。但并未包含所有源文件,并且覆盖运行始终仅限于一个项目(未记录多个应用程序中库代码的使用情况)。

运行全局笑话配置

第二种方法是运行全局笑话配置,直接抛出笑话。

node \"node_modules/jest/bin/jest.js\" -c \"jest.config.js\" --coverage --collectCoverage  --coverageReporters=html --verbose=false
Run Code Online (Sandbox Code Playgroud)

我认为,这可能与第一种方法类似,因为 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/**"
    ]
};
Run Code Online (Sandbox Code Playgroud)

图书馆

  • 角13
  • 笑话 27

Ada*_*dam 1

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

  projects: getJestProjects().map(
    (val: unknown) => (val as string).replace('<rootDir>', '<rootDir>/../../')
  ),
Run Code Online (Sandbox Code Playgroud)

以及顶部相应的导入:

import { getJestProjects } from '@nrwl/jest';
Run Code Online (Sandbox Code Playgroud)

现在,每当我运行 时,它都会运行(我认为)项目nx run frontend:test中的所有测试。workspace.json这很棒,因为我们在应用程序中只有 app.component - 其他所有内容都在libs文件夹中。添加--codeCoverage到此运行效果很好。

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