一、fixture简介
? ? ? ? fixture用来完成那些需要多次重复执行的用例,比如需要先退出,再更换其他用户登录。我们可以把用于退出和登录的用例的函数比如叫做A函数,在A函数的前面加上@pytest.fixture()装饰器,这样,这个A函数就可以被其他函数直接调用了,只要其他用例函数在执行前需要有先进行退出再更换其他用户登录的操作,都可以直接调A函数。类似unittest中setup/teardown这种前后置。
fixture可以通过设置 scope 参数来控制其作用域。fixture提供四种作用范围: function、class、module、session,session>module>class>function。
函数function:每个方法(函数)都会执行一次; 类class:每个类都会执行一次。类中有多个方法调用,都可以共享这个 fixture。(看到有说只在第一个方法调用时执行?需研究,标记一下) 模块module:一个 .py 文件执行一次。一个.py 文件可能包含多个class和function; 会话package/session:多个文件调用一次,可以跨 .py 文件。一次 pytest 会话中的所有测试函数、方法都可以共享这个 fixture
@pytest.fixture()如果不写参数,参数就是scope="function",它的作用范围是每个测试用例来之前运行一次,销毁代码在测试用例之后运行。
二、fixture用途: 1.测试前后的初始化设置,如测试数据准备,链接数据库,打开浏览器等这些操作都可以使用fixture来实现 2.测试用例的前置条件可以使用fixture实现 3.支持经典的xunit fixture ,像unittest使用的setup和teardown 4.fixture可以实现unittest不能实现的功能,比如unittest中的测试用例和测试用例之间是无法传递参数和数据的,但是fixture却可以解决这个问题
三、fixture实践
先需要下载fixture包 将需要引用的函数在def之前加个装饰器@pytest.fixture(),可以将这整个视为函数,注意fixture下命名不要用test_开头,跟用例区分开。用例才是test_开头的命名。
1.@pytest.fixture(),每个调用fixture的函数都会执行一次
输入:
import pytest
@pytest.fixture()
def func():
x=4
print("我是fixture函数,快来引用~~")
return x + 1 #fixture函数
def test_oss(func):
print('我不是类,结果为:%d'%(func))
class Test_001:
def test_answer(self,func): #引用fiture函数
print('引用fixture函数成功,结果为:%d'%(func))
assert func == 5
def test1(self,func):
print('test_2引用fixture函数成功,结果为:%d'%(func))
def test_haha(self):
print('我是测试用例haha')
if __name__=='__main__':
pytest.main(['-v','-s','test_study.py'])
运行结果:
2.@pytest.fixture(scope='class'),测试类内的每一个测试方法都调用了fixture,fixture只在该class下所有测试用例执行前执行一次
将以上代码@pytest.fixture()更换成@pytest.fixture(scope='class')
运行结果:
|