pytest之conftest.py和fixture介绍

一、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函数名即可,且函数名代表返回值

pytest之conftest.py和fixture介绍_第1张图片

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

你可能感兴趣的:(自动化框架,pytest,自动化测试,pytest)