文章目录

  • 1. pytest执行模块不是顺序的
  • 2. 实际举例
  • 3. 解决case之间的相互影响


1. pytest执行模块不是顺序的

pytest在执行一个模块的所有case时,并不是按照代码从上往下的顺序执行的。

每个case的测试环境是一定的,有前置和后置环节,如果在测试过程中有其他case插入,就可能产生这样的情况:其他case的操作导致被插入的case执行环境异常,从而导致测试不通过。即:case之间相互影响。

2. 实际举例

以上是在某个自动化测试过程中发现了该问题。

test_live_window 这个case 在执行测试时,出现部分跑过、部分不过的问题,而且这个问题在Jenkins上跑是必现的。

pytest 并发执行 class pytest 执行顺序_软件测试


另外,我通过对比那部分报错的case,发现报错的位置都是一样的,涉及具体的业务就是获取的“窗格信息”的宽和高数值反了,即宽变成了高,高变成了宽。

pytest 并发执行 class pytest 执行顺序_参数化_02

于是我在本地的pycharm中执行这个test_live_window 的case,并没有发现问题,都是可以跑过的。

pytest 并发执行 class pytest 执行顺序_pytest 并发执行 class_03

那么问题出在哪里呢?
可以看出,只有在Jenkins上跑全部的case时会出现,在本地单跑这一条测试用例可以成功,没有问题;那么我现在本地的pycharm中扩大测试范围,即跑 test_live_window 所在的脚本(模块),这样会执行该脚本中的所有case,而不只是 test_live_window 单条case,在这种方法下,终于发现了问题,能复现在使用Jenkins跑所有测试脚本时出现的问题了。

从图中可以看出,test_live_window 这个case的所有参数化构建的场景一共有18个,但并不是连续跑完的,中间竟然还跑了其他的case,这里中间插入的就是 test_live_ucode_mirror(这个case会切换镜像,难怪会产生前面提到的宽和高相反的问题),这样就破坏了test_live_window的测试环境了。

pytest 并发执行 class pytest 执行顺序_软件测试_04

3. 解决case之间的相互影响

使用class,用类的范围将 test_live_window 包含起来,这样即使再多的参数化构建,也会一起连续跑完了,不会被其他无关的case插入,可以保证当前的测试环境没有问题。

原来是写成一个单独的函数:

pytest 并发执行 class pytest 执行顺序_测试环境_05


现在用class包含起来:

pytest 并发执行 class pytest 执行顺序_测试环境_06


同时,在写case时,要注意每个fixture的作用范围,合理地使用function、class、module等。