JavaScript class单元测试覆盖率核心是覆盖所有可执行逻辑路径,包括构造函数、方法(含私有/异步)、getter/setter、静态方法及各类边界异常场景;Jest通过源码插桩统计行、分支、函数执行情况,需配置collectCoverageFrom并人工验证HTML报告中各分支是否被点亮。

对 JavaScript 中 class 语法做单元测试覆盖率,核心不是“给 class 加 coverage”,而是**覆盖 class 内部所有可执行逻辑路径**——包括构造函数、方法(含私有方法)、getter/setter、静态方法,以及它们在各种输入、边界、异常场景下的行为。Jest 是最常用且开箱即用的工具。
明确要覆盖的 class 成分
一个典型的 class 可能包含这些需覆盖的部分:
- 构造函数(初始化逻辑、参数校验、默认值处理)
- 实例方法(公共/私有)、箭头方法、异步方法(
async) - getter/setter(尤其是含副作用或计算逻辑的)
- 静态方法(
static)和静态属性初始化 - 条件分支(
if/switch)、循环、提前返回(return)、错误抛出(throw)
用 Jest 编写可覆盖的测试用例
确保每个测试用例对应一个明确的行为路径,避免“一个 test 调多个方法”。例如:
// Calculator.js
export class Calculator {
constructor(precision = 2) {
if (precision < 0) throw new Error('Precision must be non-negative');
this.precision = precision;
}
add(a, b) {
if (typeof a !== 'number' || typeof b !== 'number') return NaN;
return Number((a + b).toFixed(this.precision));
}
get isPrecise() {
return this.precision > 0;
}
}
对应测试应分别覆盖:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 正常构造:✅
new Calculator()、✅new Calculator(4) - 非法构造:✅
new Calculator(-1)→ 抛错 -
add正常数值:✅calc.add(1.111, 2.222)→ 按精度截断 -
add非数字输入:✅calc.add('a', 1)→ 返回NaN -
isPrecisegetter:✅new Calculator(0).isPrecise(false)、✅new Calculator(1).isPrecise(true)
配置 Jest 收集 class 的覆盖率
关键在 jest.config.js 中正确设置 collectCoverageFrom,确保 .js 文件(含 class 定义)被纳入插桩范围:
module.exports = {
collectCoverage: true,
collectCoverageFrom: [
'src/**/*.js',
'!src/**/index.js', // 排除入口聚合文件
'!src/**/*.test.js', // 排除测试文件本身
],
coverageThreshold: {
global: { lines: 90, branches: 85, functions: 90, statements: 90 }
}
};
注意:Jest 默认使用 源码插桩(instrumentation),会在运行时向你的 class 代码中注入计数器,统计哪些行、分支、函数被执行过 —— 这就是覆盖率数字的来源。
验证覆盖率是否真实有效
跑完 npx jest --coverage 后,不要只看总百分比。打开生成的 HTML 报告(coverage/lcov-report/index.html),逐个点击你的 class 文件,检查:
- 构造函数里
if (precision < 0)分支是否绿色(已执行)?红色说明没测异常路径 -
add方法中的typeof判断两个分支(数字 / 非数字)是否都被点亮 - getter 内部逻辑是否有未执行的语句(比如嵌套三元、复杂表达式)
覆盖率工具不会识别“逻辑是否合理”,只记录“是否执行”。所以高覆盖率 ≠ 无 bug,但低覆盖率一定意味着存在未经验证的盲区。

















