pytest+requests+allure测试框架中,如何实现用例的数据驱动取出来的数据同步到fixture中,作为参数使用

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 所需的参数列表。下面是一个例子,展示如何动态生成参数化装饰器:

使用字典作为数据源

如果你想更灵活地管理测试数据,可以考虑使用字典作为数据源,这样你可以更容易地扩展或修改测试数据,而不需要调整参数化装饰器中的参数名:

在这个例子中:

data_fixture 是测试函数接收的参数名,同时也是 indirect 指向的 fixture 名称。
test_input 和 expected 是其他参数,它们直接传递给测试函数,不涉及 fixture。
关键点总结
参数名一致性:@pytest.mark.parametrize 装饰器中的参数名和测试函数的参数名需要一致。
fixture 名称匹配:当你使用 indirect 参数时,参数化装饰器中的参数名需要与 fixture 的名字匹配,以便 pytest 正确地将参数传递给 fixture。
灵活性:除了那些需要通过 fixture 获取值的参数外,其他的参数名可以自由命名,只要它们在参数化装饰器和测试函数中保持一致即可。

因此,在你的例子中,data_fixture 可以被重命名为任何你想要的名字,比如 data_fixture,但前提是这个新名字也要在 indirect 列表中正确引用,并且在测试函数中作为参数名使用。

posted @ 2024-12-21 09:43  南峤  阅读(37)  评论(0)    收藏  举报