研发效能 pytest 怎么异步执行用例呢

tester · 2022年01月25日 · 最后由 胡适 回复于 2022年02月07日 · 6122 次阅读

接口自动化用例变多了,其中有些用例更是需要等待。
最后造成的结果就是执行时间很长,因此打算考虑一下异步执行。
有这么几个问题
1.pytest 自身有插件可以做吗?
2.如果异步执行,会影响 conftest 里面的 fixture 吗
3.影响 allure 报告吗
求各位大佬解答

共收到 9 条回复 时间 点赞

你要的是分布式执行吧,异步的概念简单来讲是不立马等待响应结果。我的理解如果用例 (function) 异步了的话,pytest 会认为这个用例执行完了,后置 hook 应该会被立马触发

  1. 可以安装 pytest-asyncio 插件,安装插件后有两种方式运行异步函数,①使用 pytest.mark.asyncio 标记测试用例,②配置文件里写 asyncio_mode = auto,pytest 会自动识别异步函数然后用异步的方式执行。
  2. 加了异步插件后,不影响之前的同步测试用例和 fixture,如果需要使用异步 fixture,可以加@pytest_asyncio.fixture
  3. pytest-asyncio 插件原理上是把异步协程封装成同步函数,只是给用例执行套了一层壳,原则上不影响 pytest 原有功能和其他插件
  4. 异步协程只能提高并发量,并不能减少网络 io 时间,而 pytest 是按顺序运行测试用例的,所以使用异步并不能减少测试的执行时间。

这个也不行,会多次执行 conftest 里面 fixture 设置为 session 的方法

https://cloud.tencent.com/developer/article/1819464?from=article.detail.1357912 这篇文章有说明官方如何操作 使用 pytest-xdist 时 scope = session 的 fixture 只执行一次的

我看过的,这个不行,官方的意思是,锁定一个文件,每次执行都时候从文件读取。
但是假如我有方法是需要在用例开始,和结束执行的呢,这个就做不到了

frankxii 回复

我试了一下,没有减少用例执行时长。
我第一个用例需要 5 分钟,第二个用例也是 5 分钟,最后执行结束还是花了 10 分钟

如果用例之间没有依赖,倒是可以考虑 celery,让 celery 去执行轮巡任务和断言,但是这样 pytest 可能会立即判断用例已执行完成,所以可能得看下 pytest 源码,或者看下哪个 hook 控制判断用例结束的标准,来做对应的修改(有这个思路,还没具体实践过)

可以参考我之前帖子里面应用 Jenkins 多配置的分布式执行方案,但是前提是每个用例是独立的,不能存在依赖关系

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册