Pytest+DDT运行测试报fixture 'invalid_email' not found错误
问题原因
报错本质是Pytest收集用例时没有接收到DDT传入的测试参数,就默认将测试方法定义的invalid_email形参当作fixture去查找,最终触发找不到fixture的错误。
你这个场景下的直接诱因有两个:
- 单参数测试用例错误使用
@unpack装饰器:@unpack的作用是将传入的可迭代对象拆分为多个独立参数,匹配测试方法的多个形参,仅在多参数传值时需要。你当前测试用例只需要接收1个邮箱参数,加了@unpack后,DDT会把传入的单个字符串(比如"qqq")按可迭代对象拆成多个单字符('q'、'q'、'q'),和测试方法的形参数量完全不匹配,导致参数注入失败。 get_csv_data读取逻辑大概率不符合预期:如果读取时没有跳过第一行表头、或者把每一行解析成列表/字典的结构不对,也会导致DDT拿到的数据格式错误,无法完成参数注入。
解决方法
按优先级操作即可:
- 删掉测试方法上的
@unpack装饰器:单参数传值不需要拆分,@data会直接把传入的每个元素赋值给invalid_email形参。 - 校验
get_csv_data的返回值:单独调用该方法打印结果,确保满足两个要求: - 跳过CSV第一行的表头
invalid_email,不要把表头当测试数据 - 最终返回的是一维列表,格式类似
["qqq", "111"],每个元素就是一个待测试的非法邮箱字符串
举个符合要求的CSV读取实现参考:import csv def get_csv_data(file_path): res = [] with open(file_path, mode='r', encoding='utf-8') as f: reader = csv.reader(f) next(reader) # 跳过表头行 for row in reader: if row: # 跳过空行 res.append(row[0]) # 取第一列的邮箱值 return res - 校验CSV文件路径有效性:不要硬编码绝对路径,避免切换运行环境、工作目录变更时读不到文件。如果读文件时加了异常捕获,不要静默吞错返回空列表,读失败直接抛出异常方便排查。
- 如果以上操作后还是报错,执行
pip install -U ddt升级DDT到最新版本,避免旧版本和当前Pytest版本存在兼容问题。
修正后的测试方法片段参考:
@pytest.mark.run(order=1) @data(*get_csv_data('/Users/blabla/utilities/test_data.csv')) def test_invalid_sign_up_invalid_email(self, invalid_email): self.test_user.invalid_signup(invalid_email) time.sleep(3) result = self.test_user.verify_error_sign_up()
内容的提问来源于stack exchange,提问作者SufferingNoob
相关产品推荐
相关产品推荐

