新手区 pytest 用例数据依赖如何处理

Smile · 2020年12月27日 · 最后由 陈恒捷 回复于 2020年12月29日 · 6355 次阅读

A 用例的返回参数如何传给 B 用例,两个用例是两个 py 文件分开的,除了 conftest 还有别的实现方式吗

共收到 20 条回复 时间 点赞

利用一个 py 文件,作为中间变量?

先考虑下测试分层解耦吧,为什么 B 用例要用到 A 用例的返回数据,用例不是只要知道通过还是失败就行了吗。
如果测业务流程有数据依赖,把涉及到的方法组织在一起做一条完整的流程用例,而流程中的各个步骤使用各自独立的数据单独测试会不会好点。
非要这么干的话,用 redis 也是个选择。

建立一个共享数据库?

我的做法比较粗暴,前面用例获取到的数据放到一个公共变量里,后面的用例直接调用就可以了

仅楼主可见
MarvinWu 回复

主要是需要做一套流程,依赖有点多

Lina93-go 回复

感觉有点麻烦了

Jerry li 回复

用 Conftetst 吗

Thirty-Thirty 回复

把需要的写在 conftest 里如何

用例之间最好不要相互关联,可以把 A 封装成一个公共方法

Smile #11 · 2020年12月28日 Author
cool 回复

应为需要做一整套测试流程,所以可能会有关联

pytest 定义 scope 为 session 的 fixture,存放 py 模块之间的全局变量,每个用例动态添加进去相互复用,也许能达到你的效果,可以参考下https://testerhome.com/topics/27284

不过如何在一个用例中,引用其他用例,来实现用例级别的复用,还在思考中,等想好了再写篇文章来说说。

可以把 A 用例作为一个数据初始化的步骤进行封装,或者想办法在数据库创建数据替代 A 用例

建议可以分一下层,把一些多个用例可能用到的部分抽离到一个操作层。
操作层只封装操作,不封装断言。和用例相比主要差一句断言。

举个例子,登录 login 可以封装到一个操作层,参数是 username 和 password ,返回值是整个 response
用例可以直接调用 login 获取 response 做断言,形成登录相关的用例
也可以调用 login 放到准备阶段,作为被其他用例依赖的操作

Smile #16 · 2020年12月28日 Author

谢谢 我去看看

Smile #17 · 2020年12月28日 Author
homin 回复

准备试试 redis

Smile #18 · 2020年12月28日 Author
陈恒捷 回复

主要是领导要求完成一套流程化的,所以关联会有点多

当用例之间存在很多关联/依赖的时候,实现用例会越来越复杂,复杂到无法实现,更别提维护了。
所以 pytest 从设计上就不支持这样的操作,别的自动化测试框架也大都如此。

Smile 回复

关联多没关系呀,类比业务系统里面微服务架构,各个 service 相互调用关联也很多。

但要保障的是,用例之间是需要有独立性的。可以封装背后的一些流程,但不要直接调用用例造成用例的依赖。

举个实际点的例子,信贷业务,完成流程需要完成 注册 - 登录 - 授信 - 审批 - 提现 - 还款 这么长的流程。还款的前提是前面 5 步都得完成。我们实际使用的时候会建立一个操作层(叫 operation),用来封装一些流程,比如会封装 授信 流程,里面会包含 注册、登录、授信 三个操作。然后封装审批,审批会包含 授信、审批 操作,如此类推,最后得到一个从零到完成提现的 提现 流程封装,还款时就可以直接调用这个封装作为 setUp 了。

在这些流程操作里,尽量不要有太多断言,只负责操作,不负责操作结果,这样才便于用例复用时用于各种异常场景。

同时这些流程封装,还可以抽离到一些 controller 暴露接口出来,用于平时测试时造数据。

不过其实一开始用例不多的时候,可以先直接把这些用例从头撸到尾,把那几个最重要的流程自动化用例搞出来在项目里使用。再逐步在增加用例的过程中重构抽离,找到自己最合适的方式。

Smile 关闭了讨论 02月04日 16:57
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册