测试覆盖率分析器
这个技能帮助识别测试覆盖率的空白,并提出具体的测试用例以提高代码质量。
何时使用这个技能
- 用户要求分析测试覆盖率
- 用户想要提高测试覆盖率
- 用户请求缺失测试的建议
- 致力于提高代码覆盖率百分比
- 用户提到"覆盖率空白"、“未测试代码"或"测试建议”
指令
1. 检测测试框架
识别项目中使用的测试框架:
JavaScript/TypeScript:
- Jest:
jest在 package.json 或 jest.config.js - Mocha:
mocha在 package.json 或 .mocharc - Vitest:
vitest在 package.json 或 vitest.config.js - Jasmine:
jasmine在 package.json
Python:
- pytest:
pytest在 requirements.txt 或 pytest.ini - unittest: 标准库,检查测试文件
- coverage.py:
coverage在 requirements.txt
Ruby:
- RSpec:
rspec在 Gemfile - Minitest: 标准库
Go:
- 内置:
go test(通过go test -cover覆盖)
Java:
- JUnit: 在 pom.xml 或 build.gradle 查找 JUnit
- JaCoCo: 覆盖工具配置
使用 Glob 和 Grep 查找配置文件。
2. 定位覆盖率报告
找到现有的覆盖率报告:
常见位置:
coverage/目录.nyc_output/(Node.js 的 NYC)htmlcov/(Python 的 coverage.py)target/site/jacoco/(Java 的 JaCoCo)- 覆盖率文件:
lcov.info,coverage.json,.coverage
如果没有覆盖率报告存在:
- 指导用户运行覆盖率:
npm test -- --coverage,pytest --cov等。 - 等待报告生成后再进行分析
3. 解析覆盖率数据
提取覆盖率信息:
从 lcov.info:
- 行覆盖与总数
- 函数覆盖与总数
- 分支覆盖与总数
- 按文件的未覆盖行号
从 coverage.json (Jest):
- 语句覆盖百分比
- 分支覆盖百分比
- 函数覆盖百分比
- 行覆盖百分比
- 每个文件的未覆盖行
从 .coverage (Python):
- 使用
coverage report或coverage json - 缺失的行范围
- 排除的行
从 HTML 报告:
- 读取摘要统计
- 识别覆盖率低的文件
4. 识别覆盖率空白
优先考虑需要测试的文件/函数:
高优先级:
- 业务逻辑 0% 覆盖
- 公共 API 和导出函数
- 错误处理路径(catch 块,错误回调)
- 边缘情况和边界条件
- 关键路径(认证,支付,数据验证)
中优先级:
- 部分覆盖的实用函数
- 由公共 API 调用的私有函数
- 配置和初始化代码
低优先级:
- 简单的 getter/setter
- 类型定义
- 自动生成的代码
- 第三方代码
5. 分析未测试的代码路径
对于每个有覆盖率空白的文件:
- 阅读源文件以理解代码结构
- 识别未测试的代码:
- 未覆盖的行和行范围
- 未测试的条件分支(if/else)
- 未覆盖的错误处理程序
- 缺失的函数覆盖
- 分类缺失的测试:
- 正常路径测试
- 错误/异常测试
- 边缘情况测试
- 集成测试
6. 生成测试建议
对于每个覆盖率空白,提出具体的测试用例:
格式:
文件:src/utils/validator.js (42% 覆盖)
缺失覆盖:
- 行 15-18:电子邮件验证错误路径
- 行 23-25:空输入处理
- 行 30-35:特殊字符的边缘情况
建议测试:
1. 测试电子邮件验证无效格式(覆盖行 15-18)
2. 测试验证器空字符串输入(覆盖行 23-25)
3. 测试名称中特殊字符处理(覆盖行 30-35)
测试用例详情应包括:
- 测试描述
- 输入数据
- 预期输出/行为
- 覆盖的行/分支
7. 创建测试桩(可选)
如果用户想要,生成测试文件桩:
- 使用适当的测试框架语法
- 包括 describe/test 块与 TODO 注释
- 添加示例测试结构
- 参考
templates/test-template.js(或适当的扩展名)中的模板
示例(Jest):
describe('Validator', () => {
describe('validateEmail', () => {
it('should reject invalid email format', () => {
// TODO: 测试电子邮件验证错误路径(行 15-18)
const result = validateEmail('invalid-email');
expect(result.valid).toBe(false);
});
it('should handle empty string input', () => {
// TODO: 测试空输入处理(行 23-25)
});
});
});
8. 计算覆盖率指标
提供摘要统计:
- 总体覆盖率百分比
- 按文件/目录的覆盖率
- 没有测试的函数/方法
- 覆盖率低的关键文件
- 覆盖率趋势(如果有历史数据)
9. 优先推荐
按以下顺序排列建议:
- 影响:首先考虑关键业务逻辑
- 风险:高风险区域(安全,数据完整性)
- 复杂性:复杂逻辑需要更多测试
- 易用性:快速获胜(简单测试以获得高覆盖率增益)
10. 输出格式
以清晰、可操作的格式呈现发现:
覆盖率分析摘要
=========================
总体覆盖率:67%
- 语句:65%
- 分支:58%
- 函数:72%
- 行:67%
需要关注文件(按优先级排序):
1. src/payment/processor.js (23% 覆盖) - 高优先级
- 缺失:支付失败的错误处理
- 缺失:重试逻辑测试
- 缺失:交易验证
2. src/auth/validator.js (45% 覆盖) - 中等优先级
- 缺失:无效令牌处理
- 缺失:过期会话测试
建议测试用例:
[每个文件的详细建议]
最佳实践
- 关注有意义的覆盖率:100% 覆盖率并不总是必要的
- 测试行为,而不是实现:建议测试以验证功能
- 优先考虑关键路径:首先进行认证、支付、数据验证
- 考虑测试类型:单元测试、集成测试和端到端测试
- 检查现有测试:不要建议已经存在的测试
- 现实的测试数据:在示例中使用合理的输入
- 覆盖率阈值:建议最低覆盖率目标(例如,80%)
运行覆盖率报告
根据检测到的框架提供命令:
Jest: npm test -- --coverage 或 jest --coverage
Vitest: npm test -- --coverage 或 vitest run --coverage
Mocha + NYC: nyc mocha
pytest: pytest --cov=src --cov-report=html
Go: go test -cover ./... 或 go test -coverprofile=coverage.out
JUnit + JaCoCo: mvn test jacoco:report
支持文件
scripts/parse-coverage.sh: 帮助脚本以提取覆盖率数据templates/test-template.js: JavaScript 的测试文件模板templates/test-template.py: Python 的测试文件模板templates/test-template.go: Go 的测试文件模板