为何本地使用未知组件的JEST单元测试通过,Bitbucket Pipeline却失败?
NX工作区Jest测试本地与流水线执行结果不一致解决方案
问题描述
- 为复现该问题已创建全新NX工作区
- 本地执行
npx jest时,控制台会抛出组件未识别错误,但单元测试不会被判定为失败 - 在Bitbucket Pipeline中执行相同命令时,测试直接失败
- 该问题会大幅增加问题排查修复成本,仅在流水线环节触发的测试失败会消耗大量开发时间
根因说明
出现本地和流水线执行结果不一致的常见原因如下:
- CI环境规则差异:CI环境默认会开启
CI环境变量,Jest在CI模式下会默认将控制台抛出的错误判定为测试失败,本地非CI模式下仅会打印错误不会终止测试 - 依赖版本差异:本地安装的依赖版本和流水线安装的依赖版本存在偏差,
jest、@nx/jest等相关包的版本差异会导致执行逻辑不同 - 环境配置差异:本地和流水线的Node版本、全局配置存在差异,会导致组件编译注册逻辑不同
修复步骤
- 先在本地开启CI模式复现问题,执行命令:
CI=true npx jest
如果本地执行上述命令也出现测试失败,即可确认是CI严格模式导致的差异,接下来针对性处理组件未识别报错即可
2. 检查测试用例中是否正确引入、注册用到的自定义组件,也可以在jest的全局setup文件中统一注册项目常用的自定义组件,避免单测漏注册
3. 如果确认该组件未识别报错不影响测试逻辑,可以在jest.config.js中添加配置关闭CI模式下的报错拦截规则:
module.exports = { // 其余原有配置保持不变 testEnvironmentOptions: { failOnError: false, failOnWarning: false } }
- 锁定相关依赖版本,将
package.json中jest、@nx/jest、babel-jest等相关包的版本固定,同时将锁文件package-lock.json/yarn.lock/pnpm-lock.yaml提交到仓库,保证本地和流水线安装的依赖版本完全一致 - 调整Bitbucket Pipeline配置,保证流水线使用的Node大版本和本地开发环境的Node大版本一致
内容的提问来源于stack exchange,提问作者Mateusz Klimentowicz
相关产品推荐
相关产品推荐

