当我尝试生成 Jenkins 管道作业的综合覆盖率报告时,发生了一些奇怪的事情。
我有一个 Nx 支持的 Angular monorepo,并且正在生成其中包含的所有库和项目的覆盖率报告。
我已将以下脚本放在一起来运行测试,然后用于nyc合并和报告操作。
const { execSync } = require('child_process');
const packageJSON = require("../package.json");
const EXCLUDE_UNIT_TEST = packageJSON.buildData.excludeUnitTest;
const run = (commands) => {
commands.forEach((command) => execSync(command, { stdio: 'inherit' }));
};
run([
`rm -rf coverage`,
`npx nx run-many --target=test --all --maxWorkers=4 --exclude=${EXCLUDE_UNIT_TEST} --coverage=true`,
`npx copyfiles -f 'coverage/**/*coverage.json' coverage/project-parts`,
`npx nyc merge coverage/project-parts coverage/nyc/combined.json`,
`npx nyc report --reporter html-spa --reporter lcov -t coverage/nyc --report-dir coverage/combined`
]);
Run Code Online (Sandbox Code Playgroud)
这在本地对我来说效果很好,我看到我的所有库/项目都有一个 HTML 报告(lcov 格式和 html-spa 报告)。
但是,当在 …
我为 GitLab 存储库进行了 CI 设置,并且该作业包含以下到 STDOUT 的输出。
=============================== Coverage summary ===============================
Statements : 94.25% ( 291/333 )
Branches : 62.29% ( 53/75 )
Functions : 73.32% ( 170/196 )
Lines : 94.68% ( 533/569 )
================================================================================
Run Code Online (Sandbox Code Playgroud)
在.gitlab-ci.yml该工作的文件中,我有coverage: /^Statements\s*:\s*([^%]+)/. 同样,在我设置的存储库的 CI/CD 设置中^Statements\s*:\s*([^%]+)。
然而,代码覆盖率似乎出现Unknown在代码覆盖率徽章上。
我目前正在为使用 @vue/cli-plugin-unit-mocha 运行单元测试的 Vue 项目设置测试环境。该项目使用 TypeScript 和 .vue 单文件组件。我已经成功地设置了我的项目来运行单元测试并为 TypeScript 文件生成代码覆盖率报告,但是当我尝试为 SFC 添加测试时,我收到一个错误。
为了生成覆盖率报告,我使用 nyc + istanbul-instrumenter-loader。我认为我的配置对于常规 Typescript 文件是正确的,但是当它必须处理 .vue 文件时 istanbul-instrumenter-loader 会引发错误:
error in ./src/pages/rapportages/components/reports-grid/reports-grid-container.vue?vue&type=script&lang=ts&
Module build failed (from ./node_modules/istanbul-instrumenter-loader/dist/cjs.js):
TypeError: Cannot read property 'fileCoverage' of undefined
Run Code Online (Sandbox Code Playgroud)
在我看来 .vue 文件没有被正确转换/转译。
这是我的 package.json:
{
...
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint",
"test": "vue-cli-service test:unit src/**/__tests__/*.spec.ts --require mocha-setup.js",
"test:ci": "yarn run test --reporter mocha-teamcity-reporter",
"test:cover": "cross-env NODE_ENV=coverage nyc vue-cli-service test:unit src/**/__tests__/*.spec.ts --require mocha-setup.js"
}
...
"nyc": …Run Code Online (Sandbox Code Playgroud) 我尝试使用Cypress和istanbul nyc在Angular 8项目中设置代码覆盖率。
我设法对代码进行了检测(__coverage__正确设置了全局变量):
以及.nyc_output运行后生成的覆盖文件cypress:open
但是生成的覆盖率报告是空的:
$ cat coverage/coverage-final.json
{}
Run Code Online (Sandbox Code Playgroud)
执行命令时结果相同:
$ npx nyc report --report-dir ./coverage --temp-dir .nyc_output --reporter=text
----------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files | 0 | 0 | 0 | 0 | |
----------|----------|----------|----------|----------|-------------------|
Run Code Online (Sandbox Code Playgroud)
这是我的 package.json devDependencies:
"devDependencies": {
"@angular-devkit/build-angular": "^0.803.3",
"@angular-devkit/build-optimizer": "^0.803.3",
"@angular/cli": "^8.3.3",
"@angular/compiler-cli": "8.2.5",
"@angular/language-service": "8.2.5",
"@briebug/cypress-schematic": …Run Code Online (Sandbox Code Playgroud) 我尝试运行index.jsCypress:
require('@cypress/code-coverage/task')
Run Code Online (Sandbox Code Playgroud)
出现此错误:
Module not found: Error: Can't resolve '../self-coverage-helper' in 'C:\repo\patientstrength_codecover\node_modules\@cypress\code-coverage\node_modules\nyc'
Run Code Online (Sandbox Code Playgroud)
完全迷失在这里。我的package.json:
"nyc": "^15.1.0",
"cypress": "^5.0.0",
"cypress-istanbul": "^1.3.0",
"cypress-localstorage-commands": "^1.2.2",
"cypress-multi-reporters": "^1.2.4",
"@cypress/code-coverage": "^3.8.1",
"@babel/core": "^7.11.4",
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/plugin-syntax-jsx": "^7.10.4",
"@babel/preset-env": "^7.11.0",
"@babel/preset-react": "^7.10.4",
Run Code Online (Sandbox Code Playgroud) 我正在努力使用 Playwright 正确设置报道。它报告所有文件的覆盖率均为 0(测试文件本身除外,如果我包含它们)。
我从https://playwright.dev/docs/api/class-coverage和https://github.com/bgotink/playwright-coverage/blob/main/src/fixtures.ts中获得灵感。我们的项目是一个单一存储库,其中文件夹中的测试e2e-tests/在其他相邻文件夹中包含的服务器上运行端到端测试,例如frontend/.
page当前设置在每个测试文件中使用如下所示的固定装置:
// frontend.spec.ts
import { test, expect } from "../fixtures";
test("something", ({ page ) => {
// Do test stuff with page
});
Run Code Online (Sandbox Code Playgroud)
其中夹具定义为
// fixtures/page.ts
import { Page, TestInfo } from "@playwright/test";
const pageWithCoverage = async (
{ page, browserName }: { page: Page; browserName: string },
use: (page: Page) => Promise<void>,
testInfo: TestInfo
) => {
if (!page.coverage) throw new Error(`Could not collect coverage with …Run Code Online (Sandbox Code Playgroud) 在 mocha.opts 中,我确定如何设置需要考虑的覆盖模式,但不确定如何包含必须过滤掉的模式?
例如,
我有包含覆盖模式的文件mocha.opts,该文件作为参数传递给以下命令:
nyc mocha --opts ./mocha.opts
其内容mocha.opts如下:
test/tests/routes/*.test.js
但是有很多custom js scripts导入到 *.test.js 文件中。但这些custom js scripts包含我不想包含在覆盖率报告中的函数,也不想为它们编写单元测试。
有没有办法通过将这些模式声明到mocha.opts文件中来从覆盖范围中过滤掉这些模式?
我有一个节点应用程序,其中包含单独的姐妹文件夹以及用于应用程序代码和测试的随附 package.json 文件。
Project
|
|-----Application
|-----app.js
|-----package.json
|-----Tests
|
|-------test.js
|-------package.json (nyc added here)
Run Code Online (Sandbox Code Playgroud)
nyc 作为依赖项(与 mocha 一起)包含在测试文件夹中。它无法显示应用程序文件夹中文件的覆盖范围。我尝试通过在 nyc 配置中包含“../Application/**/*.js”来显式包含应用程序文件,但这似乎不起作用。
有任何想法吗?
我继承了一个带有 Jasmine 单元测试的 JS 代码库。测试框架使用karma和instanbul-combine获取代码覆盖率。它似乎istanbul-combine不适用于当前的节点模块,此外不再维护:推荐的替换是nyc. 我无法代替istanbul-combine与nyc在Makefile。
我成功地将我单独的覆盖结果 (json) 文件合并到一个coverage-final.json文件中(这个 SO 问题),但现在我需要生成摘要报告。
如何从coverage.json文件生成摘要报告?
我认为这里的一个问题是我没有.nyc_output带有中间结果的目录,因为我没有nyc用来生成覆盖数据。我所有的覆盖数据都在一个coverage目录及其子目录中。
我试过指定一个文件名:
npx nyc report --include coverage-final.json
Run Code Online (Sandbox Code Playgroud)
还尝试指定目录:
npx nyc report --include coverage
Run Code Online (Sandbox Code Playgroud)
两者都不起作用。
----------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
----------|---------|----------|---------|---------|-------------------
All files | 0 | 0 | 0 | …Run Code Online (Sandbox Code Playgroud) 我正在使用赛普拉斯和纽约配置。我的文件夹结构如下所示:
|/project
| /coverage/
/lcov-report
/index.html
|/cypress
| /main
/car
/car.spec.tsx
/color.spec.tsx
...
| /integrationRun Code Online (Sandbox Code Playgroud)
我需要一个解决方案来进入文件夹index.html中的唯一测试覆盖范围main。因此,index.html我只需要查看那里编写的测试的覆盖范围。
我注意到纽约市的文档。有一些配置https://github.com/istanbuljs/nyc#common-configuration-options。但是在那里我只能指定包含 中的功能的文件include,但是在我的项目的每个文件夹中我可以有一个测试文件,并且我不能每次都指定每个新文件以获得覆盖范围。
问题:是否有解决方案仅获取文件夹的覆盖率main或获取已编写测试的文件的覆盖率spec?或者获得具有spec.tsx扩展名的文件的覆盖范围?
nyc ×12
istanbul ×7
cypress ×3
javascript ×3
mocha.js ×2
angular ×1
babeljs ×1
gitlab ×1
jenkins ×1
next.js ×1
nrwl-nx ×1
oh-my-zsh ×1
playwright ×1
regex ×1
testing ×1
typescript ×1
unit-testing ×1
v8 ×1
vuejs2 ×1
zsh ×1