Appearance
单元测试
单元测试是对软件中最小可测试单元进行的测试,通常是指函数或方法。单元测试的目的是验证每个单元是否按照预期工作。
单元测试的重要性
- 早期发现问题:在开发过程中尽早发现问题,减少修复成本
- 提高代码质量:强制开发者编写可测试的代码,提高代码的可维护性
- 便于重构:有了单元测试,开发者可以放心地重构代码,而不用担心破坏现有功能
- 文档作用:单元测试可以作为代码的文档,展示代码的预期行为
单元测试框架
JavaScript/TypeScript
- Jest:Facebook 开发的测试框架,功能强大,易于使用
- Mocha:灵活的测试框架,支持多种断言库
- Jasmine:行为驱动开发(BDD)风格的测试框架
- Vitest:基于 Vite 的测试框架,速度快
Python
Java
C#
单元测试最佳实践
- 测试名称要清晰:测试名称应该描述测试的目的和预期结果
- 测试要独立:每个测试应该独立运行,不依赖其他测试的结果
- 测试要简洁:每个测试应该只测试一个功能点
- 测试要覆盖边界情况:测试应该覆盖正常情况、边界情况和异常情况
- 测试要快速:单元测试应该快速运行,以便频繁执行
- 使用 mock 和 stub:对于外部依赖,使用 mock 或 stub 来隔离测试
- 测试代码也要维护:测试代码和生产代码一样需要维护
测试覆盖率
测试覆盖率是衡量测试质量的重要指标,常用的覆盖率指标包括:
- 语句覆盖率:测试执行了多少代码语句
- 分支覆盖率:测试执行了多少代码分支
- 函数覆盖率:测试执行了多少函数
- 路径覆盖率:测试执行了多少代码路径
示例:Jest 单元测试
javascript
// 被测试的函数
function sum(a, b) {
return a + b;
}
// 单元测试
test('sum 函数应该正确计算两个数的和', () => {
expect(sum(1, 2)).toBe(3);
expect(sum(-1, 1)).toBe(0);
expect(sum(0, 0)).toBe(0);
});示例:pytest 单元测试
python
# 被测试的函数
def sum(a, b):
return a + b
# 单元测试
def test_sum():
assert sum(1, 2) == 3
assert sum(-1, 1) == 0
assert sum(0, 0) == 0总结
单元测试是保证代码质量的重要手段,通过编写高质量的单元测试,可以提高代码的可维护性和可靠性,减少 bug 的产生。选择合适的测试框架,遵循最佳实践,是编写有效单元测试的关键。