pytest扫盲5--fixture之conftest.py文件
conftest.py:
1)专门存放 fixture 的文件
2)conftest.py 可以存放多个 fixtures
3)conftest.py 文件名称是固定的,不能改变
4)conftest.py 只对同一个 package 下的用例生效
5)不同目录可以有自己的 conftest.py,一个项目中可以有多个 conftest.py
6)pytest 执行用例时,会自动查找 conftest.py
7)fixture 可以使用 return 和 yield 产生返回值,供函数调用,调用直接使用 函数名,yield 返回值后仍可以继续进行 teardown 处理
8)yield 遇到异常后,不会影响后面的 teardown 运行
示例代码:
# File : conftest.py # IDE : PyCharm import pytest @pytest.fixture(scope='module') def login_(): print('conftest.py中module级别登录,.py文件只执行一次') yield print('module级别中的 yield 执行,退出登录,用例执行结束!') @pytest.fixture(scope='function') def databaseConnection(): print('function级别,数据库连接成功!') yield print('function级别,断开数据库连接!') @pytest.fixture(scope='function') def add(): print('function级别,这里使用了 return 返回值') a = 0 a += 3 return a @pytest.fixture(scope='function') def add_(): print('function级别,这里使用了 yield 返回值') a = 0 a += 4 yield a print('yield 返回值后,打印测试结束!')
调用fixture:使用 fixture 函数名 作为函数或方法的参数
# File : test_demo_6.py # IDE : PyCharm import pytest def test_1(login_): # fixture函数名 作为函数或方法的参数传入 print('正在执行测试用例test_1,', end='') a = int(3/2) print('a的结果为:{}'.format(a)) assert a == 1 def test_4(add): """使用return返回值""" print('正在执行测试用例test_4,', end='') print('这里使用了return返回值,add()的结果为:{}'.format(add)) assert add <= 6 def test_5(add_): """使用yield返回值""" print('正在执行测试用例test_5,', end='') print('这里使用了yield返回值,add_()的结果为:{}'.format(add_)) assert add_ <= 6 class TestCases(): def getPhoneNum(self): return '1008611' def getEmail(self): return 'admin@163.com' def test_2(self, databaseConnection): phoneNum = self.getPhoneNum() print('执行test_2,电话号码为{0}'.format(phoneNum)) assert phoneNum == '1008611' def test_3(self): email = self.getEmail() print('\n执行test_3,邮箱为{0}'.format(email)) assert email == 'admin@163.com' if __name__ == '__main__': pytest.main(['-s', '-q', 'test_demo_6.py'])
执行:
E:\personal\python38\python.exe E:/personal/GitWorkSpace/pytest_basic/main.py conftest.py中module级别登录,.py文件只执行一次
正在执行测试用例test_1,a的结果为:1
.function级别,这里使用了 return 返回值 正在执行测试用例test_4,这里使用了return返回值,add()的结果为:3
.function级别,这里使用了 yield 返回值 正在执行测试用例test_5,这里使用了yield返回值,add_()的结果为:4 .yield 返回值后,打印测试结束!
function级别,数据库连接成功! 执行test_2,电话号码为1008611 .function级别,断开数据库连接! 执行test_3,邮箱为admin@163.com
.module级别中的 yield 执行,退出登录,用例执行结束!
5 passed in 0.02s
调用fixture:使用 @pytest.mark.usefixtures('function_name') 方式修饰类或方法, 此方法没法获取返回值,但是此方式可以叠加使用
# File : test_demo_7.py # IDE : PyCharm import pytest # 使用 @pytest.mark.usefixtures('function_name') 修饰方法或者类 @pytest.mark.usefixtures('login_') @pytest.mark.usefixtures('databaseConnection') def test_1(): print('\n正在执行测试用例test_1,', end='') a = int(3/2) print('a的结果为:{}'.format(a), end='\n\n') assert a == 1
执行:
E:\personal\python38\python.exe E:/personal/GitWorkSpace/pytest_basic/main.py conftest.py中module级别登录,.py文件只执行一次 function级别,数据库连接成功! 正在执行测试用例test_1,a的结果为:1 .function级别,断开数据库连接! module级别中的 yield 执行,退出登录,用例执行结束! 1 passed in 0.04s Process finished with exit code 0
喜时之言,多失信;怒时之言,多失体