pytest测试嵌套调用类时如何复用前序测试输出的中间数据
写法存在的问题
你的实现不符合pytest的运行规则,具体错误点如下:
- 测试函数(以
test_开头的pytest用例)的返回值不会被pytest收集保留,函数内部定义的data_loaded是局部变量,函数执行结束后就会被销毁,无法被其他测试函数直接访问。 - 你在全局位置手动调用
test_data_loaded(file_to_test)的逻辑是无效的:file_to_test是pytest的fixture,手动调用函数时不会触发pytest的fixture注入机制;且你写的return语句后没有携带data_loaded变量,就算手动调用能执行,拿到的返回值也是None,同时你也没有把调用结果赋值给名为data_loaded的全局变量,自然会报data_loaded is not found的错误。 - 单元测试的核心原则是用例之间互相独立,直接依赖另一个测试用例的执行结果本身就是不合理的设计,一旦前一个用例执行顺序变化、执行失败,后续用例都会直接崩溃。
正确实现方案
把需要复用的数据加载逻辑抽成独立的pytest fixture,所有需要用到该数据的测试用例直接注入这个fixture即可,参考代码如下:
import pytest # 原有的测试文件路径fixture @pytest.fixture() def file_to_test(): return "path/file_name" # 新增:数据加载逻辑抽为fixture,可被多个用例复用 @pytest.fixture() def loaded_data(file_to_test): read_instance = ReadFile(file_to_test) data = read_instance.load() # 此处可增加基础的数据合法性校验 return data # 测试文件读取逻辑的用例 def test_read_file(loaded_data): # 直接对加载好的数据做断言即可 assert loaded_data is not None # 测试过滤逻辑的用例,直接注入加载好的测试数据 def test_filter(loaded_data): filter_instance = Filter(loaded_data) cnv_df = filter_instance.cnvf_return_cnv() # 执行你的断言逻辑 assert ...
如果测试文件读取开销较大,可以给fixture指定作用域避免重复加载,比如写成
@pytest.fixture(scope="module"),这样同模块下的所有用例只会执行一次文件读取,复用同一份数据。
内容的提问来源于stack exchange,提问作者tere becerra
相关产品推荐
相关产品推荐

