为啥基于 jest 的单元测试现在会导致 0% 的测试覆盖率?

Posted

技术标签:

【中文标题】为啥基于 jest 的单元测试现在会导致 0% 的测试覆盖率?【英文标题】:Why are jest-based unit tests now resulting in 0% test coverage?为什么基于 jest 的单元测试现在会导致 0% 的测试覆盖率? 【发布时间】:2020-04-22 22:29:53 【问题描述】:

我不是前端开发人员,但我需要使用单元测试覆盖率进行声纳扫描。所有这些都正常工作,但我们对 SonarQube 版本进行了一次大的升级(6.x 到 7.9.1),它被破坏了一段时间,现在我正试图让它再次工作。

因为这曾经有效,所以我们必须接近,但有些细节不太正确。

构建运行时,它会运行单元测试并生成覆盖率数据,并且对“sonar-scanner”的调用会将路径发送到 lcov.info 文件。在 SonarQube 项目中,它有大量的“要覆盖的行”,但未覆盖的行数相同。我还注意到它在概述中没有“单元测试”部分。

在构建输出中,我看到很多这样的行:

DEBUG: 'src/api/Api.spec.tsx' indexed as test with language 'ts'

但如上所述,SonarQube 项目似乎不认为有任何单元测试。

作为构建脚本的一部分,在测试运行结束时,我运行“ls -lt coverage”来查看生成了什么,结果显示如下:

total 6264
-rw-r--r-- 1 81050 20059 1229978 Jan  4 19:12 clover.xml
-rw-r--r-- 1 81050 20059  720443 Jan  4 19:12 lcov.info
drwxr-xr-x 6 81050 20059    4096 Jan  4 19:12 lcov-report
-rw-r--r-- 1 81050 20059 4455341 Jan  4 19:12 coverage-final.json

我在此文件中看到对“Api.tsx”(以及许多其他文件)的引用,但我没有看到对“Api.spec.tsx”的引用,但我不知道我是否应该期待任何。

我查看了“package.json”中的笑话配置,但没有发现任何明显的问题。

我还能在这里展示什么可以提供线索?

更新

这是生成的声纳扫描仪命令行,有一些省略:

sonar-scanner -Dsonar.typescript.node=/opt/app/bin/node -Dsonar.nodejs.executable=/opt/app/bin/node -Dsonar.host.url=http://... -Dsonar.login=... -Dsonar.password= -Dsonar.javascript.lcov.reportPaths=coverage/lcov.info -Dsonar.typescript.lcov.reportPaths=coverage/lcov.info -Dsonar.branch.name= -Dsonar.language=js -Dsonar.projectKey=... -Dsonar.projectName=... '-Dsonar.exclusions=**/*.scss.d.ts, **/*.scss, **/*Props.ts, **/*State.ts, **/*index.ts' '-Dsonar.coverage.exclusions=**/*.spec.tsx, **/*.spec.ts, **/*.scss.d.ts, **/*.css.d.ts, **/*.scss' -Dsonar.projectVersion=1.0.0 '-Dsonar.sources=src/components/,src/api/,src/models/mappers/, src/utils/' '-Dsonar.lang.patterns.js=*/.ts,*/.tsx' -Dsonar.js.file.suffixes=.ts,.tsx -Dsonar.sourceEncoding=UTF-8 -Dsonar.tests=src '-Dsonar.test.inclusions=**/*.spec.tsx' -Dsonar.typescript.tslintconfigpath=tslint.json -Dsonar.log.level=DEBUG -Dsonar.verbose=true '-Dsonar.exec.maxBuffer=1024 * 1024'

【问题讨论】:

我也面临同样的问题。你有没有同样的解决方案。请分享。就我而言,当詹金管道运行时。据说找不到 lcov.info 文件并显示测试覆盖率为 0%。 希望我提供的答案有所帮助。 【参考方案1】:

我忘了我问过这个问题。我不得不回到代码和历史,看看我是否能记住我做了什么来修复它。我想这就是我在这里发现的:

https://community.sonarsource.com/t/sensor-sonarts-coverage-fails-to-match-path-with-symbolic-link/14601

简而言之,如果生成的文件中的文件路径包含符号链接条目,则 SonarTS 中存在一个错误,导致它无法遵循符号链接。我为解决这个特定问题所做的是检查我生成的文件以了解正在使用哪些符号链接的模式,我编写了一个脚本来后处理 lcov.info 和 test-report.xml 文件以替换符号链接的路径链接到非符号链接文件的绝对路径。

【讨论】:

以上是关于为啥基于 jest 的单元测试现在会导致 0% 的测试覆盖率?的主要内容,如果未能解决你的问题,请参考以下文章

基于 Jest + Enzyme 的 React 单元测试

如何在 JEST 单元测试中修复“SVG 未定义”

为啥在单元测试中使用 UITableViewCell 会导致 Trace/BPT 陷阱?

模拟安装挂钩 Jest 测试单元

为啥 Jest --runInBand 会加快测试速度?

为啥 iOS 自动布局会导致预 Retina 显示器出现明显的舍入错误(包括单元测试)