如何让pytest按CSV给定顺序执行参数化测试用例?
解决pytest参数化测试按CSV原始顺序执行的问题
问题原因
pytest默认会对参数化的测试用例,基于参数的字符串表示进行排序,导致从CSV加载的原始数据顺序被打乱。
解决方案
方案1:全局配置强制按定义顺序执行
在项目根目录创建pytest.ini文件,添加以下配置:
[pytest] test_order = defined
此配置会让pytest严格按照测试用例(包括参数化用例)的定义顺序执行,也就是CSV文件中的行顺序。
方案2:命令行临时指定执行顺序
运行测试时添加命令行参数,临时启用按定义顺序执行:
pytest --test-order=defined
方案3:改用@pytest.mark.parametrize参数化(可选)
如果更倾向于直接的参数化写法,可以把fixture参数化替换为parametrize,配合上述配置同样能保持顺序:
import os import csv import pytest CSV_FILE_NAME = "CSV file path" CSV_FILE_PATH = os.path.join(os.getcwd(), CSV_FILE_NAME) def load_tests_from_csv(file_path): with open(file_path, newline='', encoding='utf-8-sig') as csvfile: reader = csv.DictReader(csvfile) return list(reader) test_data = load_tests_from_csv(CSV_FILE_PATH) class TestClassTest: @pytest.mark.parametrize("test_data", test_data) def test_generated(self, test_data): assert True print(f"Running test with row data: {test_data}")
版本兼容说明
- 若使用pytest 7.0及以上版本,直接使用
test_order=defined配置或对应命令行参数即可。 - 若pytest版本低于7.0,可使用
--no-sort命令行参数替代,或者升级pytest到最新版本。
内容的提问来源于stack exchange,提问作者Vaani P
相关产品推荐
相关产品推荐

