一、fixture装饰器
1、 作用:声明下面紧跟的函数是夹具函数(setup and teardown),注意两者之间不要有空格,setup叫初始化函数,所有的准备工作都在setup里做,与之相对的是teardown函数,叫撕毁函数,其他函数想适用夹具函数,需要把夹具函数的名字当参数传给调用函数
2、 结构:在函数名上面加@pytest.fixture()装饰器,声明下面的函数是夹具函数,通过一个关键字yield实现setup和teardown双重功能,yield是分隔符,上面的是setup,下面的是teardown,需要teardown就写yield,如果不需要,就不写yield
@pytest.fixture()
def test_1():
print("test1 starts running")
yield
print("test1 stops")
3、 使用场景:很多接口需要前置和后置操作,比如测粉丝页面翻页加载,在测接口前先往数据库造很多数据,测试完成后需要保持数据库干净恢复原样,后置一个清除数据库内容的操作
4、 装饰器参数
a) scope=session/module/class/function
i) function:默认级别,不写这个参数就是function,以函数/方法作为整体,每个方法/函数执行一次
ii) class:以整个类作为整体,每个类执行一次fixture,在刚进入类进行初始化,类里测试方法执行完毕要退出类之前进行撕毁
iii) module:以整个模块作为整体,每个模块执行一次
iv) session:此时fixture一定是写在conftest.py里,一次性运行多个文件,以多个文件作为整体,所有文件共同执行一次
b) autouse=True:不用在方法处加夹具函数名,自动调用,默认是关的
5、 fixture装饰器书写位置
级别比较低的时候且只有这一个地方要用的时候可以不专门建个conftest文件写在conftest里,直接在当前文件写,因为建了conftest,可能会被别的文件误用,如果公共的多个地方要用,可以写在conftest里,session级别必须写在conftest里,因为是多个文件公用
6、 fixture的调用
a) fixture没有返回值:在模块或接口前写@pytest.mark.usefixtures(fixture函数名),如果一个模块或接口前有两个usefixtures,那么先执行离它近的,并不是从上往下执行(就近执行,也可以说从下往上执行)
b) fixture有返回值:在需要调用fixture的函数,直接引用fixture函数名对象,并且函数名代表fixture返回值
c) 除了非fixture函数调用fixture之外,fixture之间还可以互相调用,同第二点,在调用处传入fixture函数名即可,且函数名代表返回值
![](https://img-blog.csdnimg.cn/img_convert/3269173cd1cf840e015f564e904cb2d1.png)
7、 yield其他用法
yield本身也可以返回函数值,和return功能类似,区别是yield不结束函数
如果是夹具函数,那么夹具函数名代表夹具函数返回值,和普通函数不一样,普通函数是函数名()代表函数返回值
@pytest.fixture()
def func1():
print('111')
a = 'hello'
yield a
print('222')
def test_fix(func1):
assert func1 == 'hello'
结果是:此条用例运行通过,且在测试用例执行前后分别打印111和222
二、conftest
1、 conftest可以跨.py文件调用,所有同目录测试文件运行前都会自动执行conftest.py文件,无需导入该文件
2、 conftest.py与运行的用例要在同一个pakage下,并且有__init__.py文件
3、 conftest作用域:一个项目可以有多个conftest.py文件(分别在不同目录下),只对当前目录和子目录生效,如果在项目根目录下,就对根目录以及所有子目录生效,如果放到某个package下,那就在该package及其子目录生效。如果上层和本层的conftest.py文件同时有同名fixture,且在本层调用了该fixture,生效的是本层conftest里的fixture,如果手动调用的fixture名字不相同(或者自动调用),则不冲突,上层和本层都会被调用
4、 conftest经常和fixture一起使用,里面可以存放多个fixture