项目测试异常:1341个测试用例仅执行361个,求助排查方案
排查Mocha仅运行部分测试用例的问题
看起来你遇到了挺头疼的问题——明明有1341个测试用例,Mocha却只跑了361个,而且各种尝试(重新克隆项目、卸载yarn、加.only)都没效果。我来帮你梳理几个排查方向,一步步来:
1. 先确认文件匹配是否正确
首先得搞清楚Mocha到底能不能找到所有测试文件:
- 先在本地终端执行这个命令,统计
Domain和Infra下的.test.js文件总数:
如果统计出来的数量远低于1341,说明要么是测试文件的命名不符合find Domain Infra -name "*.test.js" | wc -l.test.js规则(比如有些是.spec.js),要么是路径嵌套太深没被**匹配到(不过Mocha的**应该支持递归匹配)。 - 试试把命令里的glob路径用引号括起来,让Mocha自己处理文件匹配,而不是让shell提前展开:
不同shell对glob的处理可能有差异,尤其是本地和Codeship环境不同的时候,这个小改动经常能解决问题。TZ=utc NODE_ENV=test NODE_PATH=./ mocha --colors --require Tests/support.js --reporter spec "Domain/**/*.test.js" "Infra/**/*.test.js"
2. 检查Mocha版本与Node 8.9.4的兼容性
Node 8.9.4是比较老的版本了,如果你用的Mocha版本太高,可能会出现兼容性问题,导致部分测试文件无法被加载:
- 先查看项目中安装的Mocha版本:
Mocha 6及以上版本要求Node.js 10+,而你用的是Node 8,所以如果是Mocha 6+,建议降级到Mocha 5.x(它支持Node 6+),执行:npm list mocha
然后再重新运行测试看看。npm install mocha@5.2.0 --save-dev
3. 排查Tests/support.js的影响
你在命令里指定了--require Tests/support.js,这个文件里的代码可能会干扰Mocha的测试发现逻辑:
- 打开
support.js,检查有没有以下内容:- 全局的
before/beforeEach钩子中使用了this.skip()或者条件跳过逻辑,导致所有后续测试都被跳过; - 有没有修改Mocha的内部配置,比如
mocha.files或者自定义了测试加载规则; - 有没有引入某些模块(比如测试覆盖率工具),可能无意中过滤了测试文件。
- 全局的
4. 检查环境变量与测试文件的条件判断
你设置了TZ=utc NODE_ENV=test NODE_PATH=./,有些测试文件可能会根据这些环境变量决定是否执行:
- 找一个确定没被运行的测试文件,打开看看开头有没有类似这样的代码:
如果有,确认这些条件在你的环境下是否满足。if (process.env.NODE_ENV !== 'test') { return; // 或者直接退出,导致测试不被执行 }
5. 检查Mocha的配置文件
项目中可能存在Mocha的配置文件,里面的规则可能过滤了部分测试:
- 检查项目根目录有没有
.mocharc.js、.mocharc.json或者旧版本的mocha.opts文件; - 查看这些文件中有没有
--ignore、--exclude之类的配置,或者指定了特定的测试文件路径,导致部分文件被排除。
6. 单独测试未运行的文件
找一个你确定应该运行但没被执行的测试文件,单独用Mocha运行它:
mocha Domain/具体路径/你的测试文件.test.js
- 如果这个文件能正常运行,说明问题出在全局的文件匹配或配置上;
- 如果不能运行,检查这个文件是否有语法错误(Node 8不支持的ES6+特性,比如可选链
?.、空值合并??等),或者文件里根本没有定义describe/it测试用例。
7. 对齐本地与Codeship的环境差异
既然本地和Codeship输出不一样,得确认两边的环境一致:
- 检查Codeship上的Node.js版本是不是8.9.4,npm版本是不是5.6.0;
- 确认Codeship上的shell环境(比如bash/sh)和本地一致,避免glob展开的差异;
- 可以在Codeship的构建脚本里先执行
find Domain Infra -name "*.test.js" | wc -l,看看文件数量和本地是否一致。
先从这些方向排查,应该能找到问题所在。如果某个步骤有发现,或者遇到新的情况,可以再细化分析。
内容的提问来源于stack exchange,提问作者Rafael Berro
相关产品推荐
相关产品推荐

