前言:

在某些大的业务场景下,很多用例当中,会使用相同的前置准备工作,和后置清理工作 。

如果在每个测试模块下,都把前置准备工作和后置清理工作都写一遍,在维护上和优化上并不是很友好。

那么我们可以如何去优化这个问题呢?

这个也就是我们前面说的fixture 共享机制

pytest 框架提供了一个fixture 共享机制,可以让不同的用例模块,使用同一个fixture。这个就是 conftest.py文件

一、conftest.py 共享实现

1、在项目根目录下,创建一个 conftest,py 文件。

2、文件名必须是conftest.py,大小写敏感,不可改名字。

3、conftest.py 当中,可以编写多个fixture

4、在测试用例文件当中,不需要引入conftest.py文件,直接调用 fixture 的函数名,会自动去conftest.py 当中查找的。

pytest怎么串联相关联用例 pytest用例之间共享_pytest怎么串联相关联用例

 

 

二、conftest.py 层级作用域

1、conftest.py在项目根目录下,则项目下的所有测试用例,均可使用conftest 中定义的fixture。即项目根目录下的conftest.py,作用域是整个项目的。

2、那,如果,conftest.py当中的fixture,只想在某个python 包内可用呢?

conftest.py  实现了层级作用域。

简单来说就是:conftest.py 在哪个目录下,此目录下(包含子目录)的所有用例可使用其中的fixture。

如下图:

(1)根目录下的conftest.py里的fixture,无论项目下的哪个用例,都可以使用。

(2)子目录moduleA下的conftest.py里的fixture,只有moduleA下的用例可以使用。

(3)子目录moduleB下的conftest.py里的fixture,只有moduleB下的用例可以使用。

pytest怎么串联相关联用例 pytest用例之间共享_用例_02

 

 

 

 moduleB下的用例文件test_module_b.py中的用例,即可以使用根目录下的conftest.py中的fixuture,又可以使用自己目录下的conftest.py的fixture:

pytest怎么串联相关联用例 pytest用例之间共享_用例_03

 

 

那么有个问题,如果出现了同名fixture怎么办呢?

这里涉及到了,测试用例在执行时,调用fixture的顺序。一般来讲,按 就近原则 调用。

测试用例文件中的fixture > 当前目录中的fixture > 上级目录中的fixture > 根目录中的fixture

三、fixture 嵌套

fixture不但支持共享 ,还支持嵌套使用。

嵌套使用即:一个fixture,可以做另外一个fixture的参数。

如下图所示:名为init2的fixture,可以作为init的参数。

并且,init当中,将init2的返回值,同样返回。

 

 

当在用例当中,调用init时,init会自动去调用init2。

下图案例中,init2为class级作用域,init为function级作用域。

fixture的执行顺序如下:

      init2的后置代码

      init的后置代码

      init的前置代码

      init2的前置代码

pytest怎么串联相关联用例 pytest用例之间共享_pytest怎么串联相关联用例_04

 

 

pytest怎么串联相关联用例 pytest用例之间共享_用例_05