Skip to content

单元测试

单元测试是对软件中最小可测试单元进行的测试,通常是指函数或方法。单元测试的目的是验证每个单元是否按照预期工作。

单元测试的重要性

  • 早期发现问题:在开发过程中尽早发现问题,减少修复成本
  • 提高代码质量:强制开发者编写可测试的代码,提高代码的可维护性
  • 便于重构:有了单元测试,开发者可以放心地重构代码,而不用担心破坏现有功能
  • 文档作用:单元测试可以作为代码的文档,展示代码的预期行为

单元测试框架

JavaScript/TypeScript

  • Jest:Facebook 开发的测试框架,功能强大,易于使用
  • Mocha:灵活的测试框架,支持多种断言库
  • Jasmine:行为驱动开发(BDD)风格的测试框架
  • Vitest:基于 Vite 的测试框架,速度快

Python

  • pytest:功能强大的测试框架,支持参数化测试、 fixtures 等
  • unittest:Python 标准库中的测试框架
  • nose2:unittest 的扩展,提供更多功能

Java

  • JUnit:Java 最流行的测试框架
  • TestNG:JUnit 的替代品,提供更多高级功能

C#

  • NUnit:.NET 平台上的测试框架
  • xUnit.net:现代的 .NET 测试框架

单元测试最佳实践

  1. 测试名称要清晰:测试名称应该描述测试的目的和预期结果
  2. 测试要独立:每个测试应该独立运行,不依赖其他测试的结果
  3. 测试要简洁:每个测试应该只测试一个功能点
  4. 测试要覆盖边界情况:测试应该覆盖正常情况、边界情况和异常情况
  5. 测试要快速:单元测试应该快速运行,以便频繁执行
  6. 使用 mock 和 stub:对于外部依赖,使用 mock 或 stub 来隔离测试
  7. 测试代码也要维护:测试代码和生产代码一样需要维护

测试覆盖率

测试覆盖率是衡量测试质量的重要指标,常用的覆盖率指标包括:

  • 语句覆盖率:测试执行了多少代码语句
  • 分支覆盖率:测试执行了多少代码分支
  • 函数覆盖率:测试执行了多少函数
  • 路径覆盖率:测试执行了多少代码路径

示例: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 的产生。选择合适的测试框架,遵循最佳实践,是编写有效单元测试的关键。

基于 VitePress 的本地知识库