fixture
作用:将函数定义为参数,并传入到其他函数中当参数使用;
被定义为fixture的函数可以当做是测试用例的资源,将资源传入用例后执行;测试的某系统需要登录/退出。那么每一条用例执行前都需要登录,执行完又都需要退出,可以使用fixture
例1:
简单入门,用fixture实现1+1=2
import pytest
@pytest.fixture() #定义一个fixture的函数,用来当资源传递给其他函数
def p1():
y = 1
return y
def p2(p1): #传入fixture资源到内部当参数使用
x = 1
s = x + p1()
print('1+1= %d' % s)
#执行
p2(p1)
>>1+1= 2
————————————————————————————————————————————————————
例2:
编写测试用例,并在测试用例中传入fixture声明的函数,fixture声明的函数,会在执行测试类前先执行
import pytest
class Test1:
@pytest.fixture()
def cou(self):
print('9999999999999999999999999999999999999')
return 1
def test_y1(self,cou):
print(u'用例1 %s' % cou)
assert cou ==2
def test_y2(self,cou):
print(u'用例2 %s' % cou)
assert cou == 3
if __name__ == '__main__':
pytest.main()
解释:在类中定义了2个测试用例,且每个测试用例都传入fixture函数,发现——fixture定义的函数会在每个用例执行前调用,如下图,用例多了会消耗手机内存,例3将进行处理
————————————————————————————————————————————————————
例3
将由于在测试类中,声明fixture,在执行用例会重复执行该代码,现通过将fixture函数分离,实现执行一次该函数,实现多次调用
1.将该函数分离出来,并命名一个叫:conftest.py的文件,内容如下:
其中,yield会在所有用例执行完后释放该资源,return不会释放资源
import pytest
@pytest.fixture(scope='session')
def cou():
print('ZheLiShi-confest.py')
# return 2
yield 22
print('end!!!!!')
2.在测试用例中编写代码:
class Test1:
def test_y1(self,cou):
print(u'yongli1 %s' % cou)
assert cou ==2
def test_y2(self,cou):
print(u'yongli2 %s' % cou)
assert cou == 2
if __name__ == '__main__':
pytest.main('-s test_y.py')
执行结果:
————————————————————————————————————————————————————
有关:yield
上面例子中,使用到yield和return,其中:
yield返回执行结果并不中断程序执行,return在返回执行结果的同时终端程序执行
————————————————————————————————————————————————————
fixture作用域的4个参数
有四种作用域的fixture,分别为function,class,module和session作用域。
简单理解
function scope,就是每一个函数都会调用;
class scope,就是每一个类调用一次,一个类可以有多个函数;
module scope,应该是一个文件调用一次,该文件内又有多个function;
session scope范围更大,是多个文件调用一次,每个文件有对应着一个module
不清楚用哪一个就挑影响范围大的:session>module>class>function
————————————————————————————————————————————————————
fixture添加测试参数
contest.py文件
@pytest.finxture(params=[1,2,3])
def canshu(request):
return request.param
test_y.py文件
class Test1:
def test_a(self,canshu):
print(‘canshu %s’ % canshu)
assert canshu ==1
if __name__ == '__main__':
pytest.main('-q test_y.py')
执行结果:
————————————————————————————————————————————————————