如何在mocha.js运行结束后断言实际执行的测试用例总数?
解决方案
方案1:用根级钩子嵌入测试断言
这是最轻量的实现方式,不需要修改测试执行逻辑,只需新增一个全局前置文件即可:
- 新建
test/setup-mocha.js文件,内容如下:
// 未全局引入chai的话打开下面注释 // const { expect } = require('chai') const testStats = { totalRun: 0, totalPassed: 0, totalFailed: 0 } // 统计所有运行的用例数 beforeEach(function () { testStats.totalRun++ }) // 统计用例执行结果 afterEach(function () { const testState = this.currentTest.state if (testState === 'passed') testStats.totalPassed++ if (testState === 'failed') testStats.totalFailed++ }) // 所有测试跑完后执行数量断言 after(function () { // 可根据你的实际用例数量调整阈值 expect(testStats.totalRun).to.be.greaterThan(400) // 也可按需添加其他断言,比如禁止失败用例 // expect(testStats.totalFailed).to.equal(0) })
- 修改
package.json中的测试命令,加载这个前置文件:
{ "scripts": { "integrationTest": "mocha --file ./test/setup-mocha.js --recursive spec test/integration", } }
方案2:通过Mocha API自定义执行脚本统计
如果不想把数量校验逻辑嵌入测试用例,可以单独写执行脚本:
- 新建
run-integration-test.js文件:
const Mocha = require('mocha') const fs = require('fs') const path = require('path') // 初始化Mocha实例,传入你需要的配置项 const mocha = new Mocha({ recursive: true }) // 加载所有测试文件 const testDirs = ['./spec', './test/integration'] testDirs.forEach(dir => { fs.readdirSync(dir) .filter(file => file.endsWith('.js')) .forEach(file => mocha.addFile(path.join(dir, file))) }) // 执行测试并校验数量 mocha.run(failures => { const runCount = mocha.runner.stats.tests if (runCount <= 400) { console.error(`测试运行数量异常:仅运行了${runCount}条,预期至少400条`) process.exit(1) } process.exit(failures > 0 ? 1 : 0) })
- 修改
package.json中的测试命令:
{ "scripts": { "integrationTest": "node run-integration-test.js", } }
补充注意事项
Mocha v8版本之后,-R短参数的含义从原来的--recursive改成了--reporter的别名,这就是你升级后用例只跑了10条的原因,日常使用尽量用全拼参数--recursive避免歧义。
内容的提问来源于stack exchange,提问作者ConorSheehan1
相关产品推荐
相关产品推荐

