共计 1865 个字符,预计需要花费 5 分钟才能阅读完成。
问题背景
在 Python 项目中编写单元测试时,开发者常遇到以下痛点:

- 重复代码多:为不同输入组合编写相似测试用例时,容易产生大量重复代码
- 边界条件遗漏:人工编写时容易忽略异常输入、极端值等边界情况
- 维护成本高:业务逻辑变更后,需要手动同步修改多个测试用例
传统解决方案如 pytest 参数化和 mock 库虽然能部分解决问题,但仍存在局限:
- 参数化需要手动设计测试数据,无法自动推断有效边界
- mock 对象配置复杂,特别是涉及多层依赖时
- 测试覆盖率提升依赖开发者经验,新人难以快速上手
Claude Code 提示词设计
核心原则
- 角色定义 :明确要求 AI 扮演 ” 资深测试工程师 ” 角色
- 输入规范 :必须包含待测函数签名和功能说明
- 输出要求 :指定使用 pytest 框架,包含正常 / 异常场景
基础模板
"""
角色:你是一位专注 Python 单元测试的工程师
任务:为以下函数生成 pytest 测试用例
要求:1. 使用 @pytest.mark.parametrize 覆盖边界条件
2. 对可能抛出的异常进行测试
3. 包含至少 3 个正常用例和 2 个异常用例
4. 每个断言添加注释说明验证逻辑
函数定义:{函数签名}
功能描述:{功能说明}
"""
实现示例
示例函数
def divide_numbers(dividend: float, divisor: float) -> float:
"""执行除法运算,当除数为 0 时抛出 ValueError"""
if divisor == 0:
raise ValueError("除数不能为 0")
return dividend / divisor
生成测试
import pytest
@pytest.mark.parametrize("a,b,expected", [(10, 2, 5), # 正常整数除法
(5.5, 2, 2.75), # 浮点数运算
(0, 1, 0), # 被除数为 0
])
def test_divide_normal_cases(a, b, expected):
"""验证各种合法输入的运算结果"""
assert divide_numbers(a, b) == expected
@pytest.mark.parametrize("a,b", [(1, 0), # 除数为 0
("1", 2), # 类型错误
])
def test_divide_exceptional_cases(a, b):
"""验证异常场景的正确处理"""
with pytest.raises((ValueError, TypeError)):
divide_numbers(a, b)
工程实践
CI/CD 集成
GitHub Actions 配置示例:
name: Test with Claude
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install pytest pytest-cov
- name: Generate tests
env:
CLAUDE_API_KEY: ${{secrets.CLAUDE_API_KEY}}
run: python scripts/generate_tests.py
- name: Run tests
run: |
pytest --cov=src --cov-report=xml
- name: Upload coverage
uses: codecov/codecov-action@v3
覆盖率评估
- 基准对比:记录引入前后的覆盖率变化
- 增量监控:重点关注新提交代码的覆盖率
- 盲区分析:使用 pytest-cov 识别未覆盖的分支
避坑指南
常见问题
- 逻辑盲区 :生成测试可能遗漏业务特殊规则
- 类型陷阱 :动态类型导致错误输入未被捕获
- 异步代码 :需要特别处理 coroutine 和 event loop
最佳实践
- 提示词迭代:根据生成结果不断补充约束条件
- 人工审查重点:
- 业务关键路径是否全覆盖
- 错误处理逻辑是否符合预期
- 测试数据是否具有代表性
延伸思考
- 如何测试具有随机性的函数(如生成 UUID)?
- 当函数依赖外部服务时,mock 到什么程度合适?
- 性能测试是否也能通过提示词自动生成?
优化 Checklist
- [] 检查所有参数边界条件
- [] 验证所有异常抛出场景
- [] 包含至少一个性能基准测试
- [] 确保测试 idempotent(可重复执行)
- [] 检查测试执行时间是否在合理范围内
正文完
发表至: 编程开发
近一天内
