pytest的xdist插件如何实现case的执行顺序?

pytest的xdist插件如何实现case的执行顺序?麻烦大佬们提供一个方向

本来分布式就是随机跑用例了。。如果是下一个用例的参数是依赖上一个用例生成的话,可以写一个fixture函数在conftest.py文件里然后调用

1 Like

你好,能具体一点吗?没太理解 :flushed:



最最简单的例子

这个例子相当于一个setup和teardown过程,如果B用例依赖于A用例执行的结果,必须A先执行后再执行B,但是又想提高测试效率,使用xdist插件,A、B用例的调用方法再不重复的前提下(例如A用例是创建商品的case,B用例是获取A创建的商品信息的case,在不重复调用创建商品的方法的前提下, 重复调用会产生双倍的测试数据,产品迭代非常快,扛不住)怎么解决A、B case的执行顺序问题?

目前我能想到的是思路:如果不想重复调用的话就先调用新增接口新增完之后不删除,然后查询接口查询那个不新增的商品

现在就是不能保证新增的接口一定处于查询接口用例执行之前先执行

手动新增一条商品,当作查询用

建议你直接在setup teardown或者是fixture里面做测试前的数据准备步骤,caseB之前先查询现有商品信息,如果没有就创建,有就直接使用,这样可以避免和caseA互相依赖,用例之间应该尽量保持独立而不是互相依赖,跟手工测试的用例思维要有所区别

拿商品只是举个例子,商品还是好解决,麻烦的是活动类型的,参与活动后会生成一个唯一的值,需要用这个唯一值做后续操作,而后续操作又会生成一个唯一值,再进行下一步操作,活动时间又比较短一般为一天的样子,如果都是采用没有就创建的话,同一个接口可能就会反复的调用2次以上了

维护成本会增加不少

xdist对用例的分配是随机的,甚至你都没办法确定的将某些用例放到同一个进程中来跑。
如果你真要互相依赖的话,只能模仿xdist来写一个自己的多进程运行插件,这样你想要的逻辑都可以自己写

只能多瞅瞅xdist的源码 模仿一下试试看

step1:
1.首先针对用例的设计,需要控制用例在同一个py文件夹内,
2.然后使用pytest-ordering插件控制case的执行顺序,
3.在使用 pytest-dependency 插件控制依赖关系。

setp2:
因pytest-xdist默认是无序执行的,但可通过 --dist 参数来控制顺序,
对第一步的设计,应选择 --dist=loadfile
即按照同一个文件名来分组,然后将每个测试组发给可以执行的worker,确保同一个组的测试用例在同一个进程中执行

自己写 hook 函数调换用例调用顺序,比如调换 items 的执行顺序:

def pytest_collection_modifyitems(
    session: "Session", config: "Config", items: List["Item"]
) -> None:
    """Called after collection has been performed. May filter or re-order
    the items in-place.

    :param pytest.Session session: The pytest session object.
    :param _pytest.config.Config config: The pytest config object.
    :param List[pytest.Item] items: List of item objects.
    """

另外,非常建议重复调用创建商品的方法,保证用例的单独不互联,一旦你用例涉及到相互依赖,会遇到非常多问题,尤其是并行。

这个方式不错 我尝试一下