Pytest之fixture 共享机制
前言:
在某些大的业务场景下,很多用例当中,会使用相同的前置准备工作,和后置清理工作 。
如果在每个测试模块下,都把前置准备工作和后置清理工作都写一遍,在维护上和优化上并不是很友好。
那么我们可以如何去优化这个问题呢?
这个也就是我们前面说的fixture 共享机制
pytest 框架提供了一个fixture 共享机制,可以让不同的用例模块,使用同一个fixture。这个就是 conftest.py文件
一、conftest.py 共享实现
1、在项目根目录下,创建一个 conftest,py 文件。
2、文件名必须是conftest.py,大小写敏感,不可改名字。
3、conftest.py 当中,可以编写多个fixture
4、在测试用例文件当中,不需要引入conftest.py文件,直接调用 fixture 的函数名,会自动去conftest.py 当中查找的。
二、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下的用例可以使用。
moduleB下的用例文件test_module_b.py中的用例,即可以使用根目录下的conftest.py中的fixuture,又可以使用自己目录下的conftest.py的fixture:
那么有个问题,如果出现了同名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的前置代码