如何在pytest中使用简易fixture避免样板代码冗余
解决方案
方案1:通用测试字符串字典fixture(推荐,实现最简单、维护成本最低)
把所有测试用字符串统一放到映射字典中管理,仅定义一个fixture返回该字典即可,新增字符串只需更新字典,不需要新增fixture定义。
实现代码
import pytest # 所有测试字符串统一维护,新增内容直接加键值对即可 TEST_STRING_POOL = { "dummy_EN": "This is an English string.", "dummy_DE": "Das hier ist Deutsch.", "dummy_FR": "la maison blanche est tombée", # 剩余3个长字符串直接往这里加 } @pytest.fixture def test_string_pool(): # 如果字符串过长或需要从外部文件加载,也可以在这里读取txt、json等文件返回 return TEST_STRING_POOL
用例使用示例
def test_load_language_models(test_string_pool): # 按需取对应字符串即可 tee = myfunc(test_string_pool["dummy_EN"]) assert tee.language == 'EN' def test_other_method(test_string_pool): tee = myfunc_2(test_string_pool["dummy_DE"]) assert tee.attribute3 == 'whatever'
方案2:工厂函数fixture(适合需要动态获取/处理测试字符串的场景)
如果需要根据参数动态调整返回的字符串(比如按长度、按场景分类返回),可以用工厂fixture,返回一个可调用函数,传参即可拿到对应字符串。
实现代码
import pytest @pytest.fixture def get_test_string(): def _getter(lang_tag: str): string_map = { "EN": "This is an English string.", "DE": "Das hier ist Deutsch.", "FR": "la maison blanche est tombée" } # 也可以在这里加自定义逻辑,比如过滤、修改字符串内容 return string_map[lang_tag] return _getter
用例使用示例
def test_load_language_models(get_test_string): en_str = get_test_string("EN") tee = myfunc(en_str) assert tee.language == 'EN'
两种方案都支持在任意测试用例中按需获取指定的测试字符串,完全避免了每个字符串单独写fixture的样板代码冗余,也满足同一个字符串在不同测试方法中独立调用的需求。
内容的提问来源于stack exchange,提问作者JFerro
相关产品推荐
相关产品推荐

