✨ 妙用 1:自动注入高质量测试数据(告别硬编码)
问题:
手动拼接用户名、邮箱易重复,且格式不规范。
解决方案:@generate_test_data 装饰器
import functoolsfrom faker import Fakerfrom threading import Lock_faker = Faker("zh_CN")_used_values = set()_lock = Lock()def _ensure_unique(value: str) -> str: with _lock: if value not in _used_values: _used_values.add(value) return value # 自动加后缀保证唯一 for i in range(1, 100): candidate = f"{value}_{i}" if candidate not in _used_values: _used_values.add(candidate) return candidate raise RuntimeError("无法生成唯一值")def generate_test_data(**fields): """ 自动生成测试数据并注入 test_data 参数 示例: @generate_test_data(username=True, email=True) """ def decorator(func): @functools.wraps(func) def wrapper(*args, **kwargs): test_data = {} for field, enabled in fields.items(): if not enabled: continue if field == "username": raw = _faker.user_name() test_data[field] = _ensure_unique(f"auto_{raw}") elif field == "email": raw = _faker.free_email() test_data[field] = _ensure_unique(f"auto.{raw}") elif field == "phone": test_data[field] = _faker.phone_number() return func(*args, test_data=test_data, **kwargs) return wrapper return decorator
使用示例:
@generate_test_data(username=True, email=True, phone=True)def test_user_register(test_data): resp = api.register( username=test_data["username"], email=test_data["email"], phone=test_data["phone"] ) assert resp.status_code == 201
✅ 效果:
自动生成 auto_zhangsan_1、auto.lisi@example.com
全局唯一,避免注册冲突
用例代码干净,无数据构造逻辑