1、在 pytest 中,如果你有多个数据驱动的 fixture 和测试用例,并希望确保它们的数据同步传递(即每个 fixture 和测试用例的数据对是一一对应的),你可以使用 pytest.mark.parametrize 来参数化测试函数和 fixture。为了确保 fixture 和测试函数中的数据同步传递,可以将它们放在同一个参数化装饰器中,并设置 indirect=True。
例如:
在这个例子中:
data_fixture 是一个接受参数的 fixture。
test_with_data 函数被 @pytest.mark.parametrize 装饰器参数化,它不仅为 data_fixture 提供了参数,也为测试函数本身提供了参数。
indirect=["data_fixture"] 表示 data_fixture 是间接应用的,意味着它的参数应该通过 request.param 传递给 fixture。
这样,每次测试运行时,pytest 都会为 data_fixture 和 test_with_data 提供一组对应的参数,确保它们同步传递。
这种方法确保了每个 fixture 和测试用例的数据对都是一一对应的,避免了 fixture 取一个值后运行所有测试用例的情况。每个测试用例只会在特定的 fixture 数据下运行一次,保持了数据的一致性和准确性。
2、实际使用场景中,数据必然是来自于数据文件,那这里的数据列表就变成了变量,怎么将变量中的数据取出来使用?
动态生成参数化装饰器
如果你有一个包含所有测试数据的变量,你可以构造出 parametrize 所需的参数列表。下面是一个例子,展示如何动态生成参数化装饰器:
使用字典作为数据源
如果你想更灵活地管理测试数据,可以考虑使用字典作为数据源,这样你可以更容易地扩展或修改测试数据,而不需要调整参数化装饰器中的参数名: