前言
之前一篇文章pytest的一些实用插件实践记录了一些实用的插件,这边记录一点pytest的高阶用法。
fixture
首先什么是fixture?
- 1.为了测试用例的执行,进行一些初始化数据的操作
- 2.实现了unittest中的setUp、tearDown功能
它的有点是什么?
实践下来,大致总结了几点:
- 1.比unittest中的setUp、tearDown调用方便
- 2.支持不同级别的fixture,默认是function级别
- 3.调用方式灵活,支持直接函数名调用、装饰器调用、autouse
1.函数名直接调用
先看代码
@pytest.fixture()
def pre():
print("beore test ")
yield
print("after test")
class Test1(object):
def test_1(self,pre):
print("tihs is test1")
assert 1==1
def test_2(self):
//未传入pre
print("this is test2")
assert 1+2 ==3
其中test_2方法没有传入pre参数,执行脚本
pytest -sq demo_fixture.py
最终结果如下:
可以看出在test_1执行之前先执行 print("beore test ") ,结束后 执行 print("after test "),而test_2 由于没有传入pre参数,所以没有执行pre的方法
备注:
这边yield实现 setup和teardown的功能
即:
yield之前的语句,在class/function/module之前执行
yield之后的语句,在class/function/module执行完成之后执行
2.装饰器调用
代码如下:
import pytest
@pytest.fixture()
def pre():
print("beore test ")
yield
print("after test")
class Test1(object):
@pytest.mark.usefixtures('pre')
def test_1(self):
//装饰器调用
print("tihs is test1")
assert 1==1
def test_2(selfs,pre):
//函数名调用
print("this is test2")
assert 1+2 ==3
class Test2(object):
def test_3(self):
print("this is test3")
assert 3+1 ==4
直接后结果如下:
可以看出,test_1 和 test_2 都执行了 pre里的方法,而test_3未调用,所以未执行
3.autouse调用
代码如下:
import pytest
@pytest.fixture(scope="class",autouse=True)
def preclass():
print("beore class ")
yield
print("after class")
@pytest.fixture(scope="module",autouse=True)
def premodule():
print("beore module ")
yield
print("after module")
@pytest.fixture(scope="function",autouse=True)
def pretest():
print("beore function ")
yield
print("after function")
class Test1(object):
def test_1(self):
print("this is test1")
assert 1==1
def test_2(self):
print("this is test2")
assert 1+2 ==3
class Test2(object):
def test_3(self):
print("this is test3")
assert 3+1 ==4
def test_4(self):
print("this is test4")
assert 3+2 ==5
fixture默认的作用范围是function,同时也支持module/class/package/session级别
上面我定义了三个级别的fixture,分别是module、class、function,可以预期的是 module方法只执行1次,class执行2次,function执行4次,结果如下:
这边对于平时接口测试或者UI自动化测试中,常用的login操作、数据库连接操作等非常实用。
4.fixture传入参数
需要注意的是,fixture传入参数,只能传入列表类型
params: an optional list of parameters which will cause multiple invocations of the fixture function and all of the tests using it.
代码如下:
import pytest
test_user_data = [{"user": "admin1", "passwd": "111111"},
{"user": "admin1", "passwd": "11234"}]
@pytest.fixture(scope="module",params=test_user_data)
def login(request):
return request.param
def test_login(login):
print(login["user"])
执行结果如下:
Demo代码地址请见github