如何为Mocha单元测试添加性能测试功能
Mocha 现有单元测试接入性能测试方法
给现有Mocha单测加性能检测不需要重构原有测试逻辑,按需求选下面两种方案即可:
方案1:零依赖快速实现(适合基础性能回归校验)
不需要安装额外第三方包,直接用Node.js原生的performance API做耗时统计,配合Mocha本身的断言逻辑就能实现最基础的性能校验,对原有代码侵入性极低。
改造后的测试代码如下:
const { performance } = require('perf_hooks'); const assert = require('assert'); // 自定义性能阈值,单位ms,比如要求目标函数单次执行耗时不能超过0.1ms const MAX_AVG_DURATION = 0.1; // 压测轮次,根据函数执行速度调整,执行越快的函数轮次设越高,降低偶然误差 const TEST_ROUNDS = 1000; describe("simple test", () => { it("first test", async() => { // 先跑原有功能断言,保证逻辑正确性 assert.equal(myProgram(), 1); // 多轮压测统计性能 const start = performance.now(); for(let i = 0; i < TEST_ROUNDS; i++) { myProgram(); } const totalDuration = performance.now() - start; const avgDuration = totalDuration / TEST_ROUNDS; // 输出性能数据 console.log(` 压测轮次: ${TEST_ROUNDS} 总耗时: ${totalDuration.toFixed(2)}ms 平均单次耗时: ${avgDuration.toFixed(4)}ms `); // 性能断言,不满足阈值直接标记测试失败 assert.ok( avgDuration < MAX_AVG_DURATION, `性能不达标:平均单次耗时${avgDuration.toFixed(4)}ms,阈值为${MAX_AVG_DURATION}ms` ); }) })
这个方案的优势是接入成本极低,和现有测试流程完全兼容;缺点是没有自动做误差校正、方差统计,适合快速拦截明显的性能回退问题。
方案2:专业基准测试(适合精确性能度量)
如果需要统计维度更全、结果更可信的性能数据,用benchmark库和Mocha适配即可,这个库会自动调整压测轮次、计算执行误差、统计每秒执行次数(ops/sec),是JS生态最常用的基准测试工具。
接入步骤:
- 安装依赖:执行命令
npm i benchmark -D - 改造测试用例,注意因为基准测试是异步执行的,需要调用Mocha的
done回调标记用例结束,代码示例:
const Benchmark = require('benchmark'); const assert = require('assert'); // 性能阈值:要求目标函数每秒执行次数不低于10000次 const MIN_OPS_PER_SEC = 10000; describe("simple test", () => { it("first test performance benchmark", (done) => { // 先校验功能正确性 assert.equal(myProgram(), 1); const suite = new Benchmark.Suite(); suite .add('myProgram执行性能', () => { myProgram(); }) .on('cycle', (event) => { // 打印单轮统计结果,包含ops/sec、误差范围 console.log(String(event.target)); }) .on('complete', function() { const testResult = this[0]; console.log(`测试完成,平均每秒执行${testResult.hz.toFixed(2)}次,误差范围±${testResult.stats.rme.toFixed(2)}%`); // 性能断言 assert.ok( testResult.hz > MIN_OPS_PER_SEC, `性能不达标:每秒仅能执行${testResult.hz.toFixed(2)}次,阈值为${MIN_OPS_PER_SEC}次/秒` ); done(); }) .run({ async: true }); }) })
接入注意事项
- 性能测试不要和普通单元测试混跑,建议单独在package.json里配置执行脚本:
"test:perf": "mocha test/perf/**/*.test.js --timeout 20000",因为性能测试执行时间更长,需要调大Mocha的默认超时时间。 - 跑性能测试时关闭debug工具、停止其他占用CPU资源的程序,避免统计结果出现偏差。
- 如果需要做跨版本性能对比,可以把每次测试输出的性能数据写入本地JSON文件作为基准值,后续测试时和基准值做对比,超过预设偏差(比如性能下降超过10%)就标记测试失败,实现自动化性能回归检测。
内容的提问来源于stack exchange,提问作者js developer
相关产品推荐
相关产品推荐

