1.替代setup和teardown
2.参数化
如何使用:
1.给要使用的方法传入fixture的函数名
2.使用装饰器@pytest.mark.usefixtures(’’)
3.可以使用多个fixture
4.作用域:session>module>class>function
给要使用的方法传入fixture的函数名
使用装饰器@pytest.mark.usefixtures(’’)
import pytest
@pytest.fixture()
def login():
print('登陆操作')
def test_case1(login):
print('这是一个测试用例1,需要提前登陆')
def test_case2():
print('这是一个测试用例2,不需要提前登陆')
@pytest.mark.usefixtures('login')
def test_case3():
print('这是一个测试用例3,需要提前登陆')
if __name__ == '__main__':
pytest.main(['test_fixture.py','-sq'])
登陆操作
这是一个测试用例1,需要提前登陆
这是一个测试用例2,不需要提前登陆
登陆操作
这是一个测试用例3,需要提前登陆
import pytest
@pytest.fixture()
def login():
print('登陆操作')
yield
print('退出登陆')
def test_case1(login):
print('这是一个测试用例1,需要提前登陆')
def test_case2():
print('这是一个测试用例2,不需要提前登陆')
@pytest.mark.usefixtures('login')
def test_case3():
print('这是一个测试用例3,需要提前登陆')
if __name__ == '__main__':
pytest.main(['test_fixture.py','-sq'])
登陆操作
这是一个测试用例1,需要提前登陆
退出登陆
这是一个测试用例2,不需要提前登陆
登陆操作
这是一个测试用例3,需要提前登陆
退出登陆
import pytest
@pytest.fixture()
def login():
print('登陆操作')
username='登录名'
password='6543210y'
token='654127'
yield [username,password,token]
print('退出登陆')
def test_case1(login):
print(f'打印用户名密码{login}')
print('这是一个测试用例1,需要提前登陆')
登陆操作
打印用户名密码[‘登录名’, ‘6543210y’, ‘654127’]
这是一个测试用例1,需要提前登陆
退出登陆
import pytest
@pytest.fixture()
def login():
print('登陆操作')
username='登录名'
password='6543210y'
token='654127'
yield [username,password,token]
print('退出登陆')
def test_case1(login):
print(f'打印用户名密码{login[0],login[1]}')
print('这是一个测试用例1,需要提前登陆')
登陆操作
打印用户名密码(‘登录名’, ‘6543210y’)
这是一个测试用例1,需要提前登陆
退出登陆
import pytest
@pytest.fixture(scope='module')
def env():
print('初始化环境')
yield
print('环境恢复')
@pytest.fixture(scope='class')
def open():
print('打开网页')
yield
print('关闭网页')
@pytest.fixture(scope='function')
def login():
print('登陆操作')
yield
print('退出登陆')
class Testcase1:
def test_case1(self,login):
print('这是一个测试用例1,需要提前登陆')
def test_case2(self,open):
print('这是一个测试用例2,需要提前登陆')
def test_case3(self):
print('这是一个测试用例3,需要提前登陆')
class Testcase2:
def test_case4(self,env):
print('这是一个测试用例4,不需要提前登陆')
if __name__ == '__main__':
pytest.main(['test_fixture.py','-sq'])
登陆操作
这是一个测试用例1,需要提前登陆
退出登陆
打开网页
这是一个测试用例2,需要提前登陆
初始化环境
这是一个测试用例3,需要提前登陆
关闭网页
这是一个测试用例4,不需要提前登陆
环境恢复
注意:
如果是scope='function’那么需要使用的每个方法都要传入fixture方法名
如果scope='class’那么需要在对应调用fixture的class中的第一个方法就要传入,否则只能在这个class中这个传入的方法后面的方法才能使用
如果scope=‘module’,和scope='class’一样
上段代码改成
class Testcase1:
def test_case1(self,login,open,env):
print('这是一个测试用例1,需要提前登陆')
def test_case2(self,open):
print('这是一个测试用例2,不需要提前登陆')
def test_case3(self,login):
print('这是一个测试用例3,需要提前登陆')
class Testcase2:
def test_case4(self,env):
print('这是一个测试用例4,不需要提前登陆')
if __name__ == '__main__':
pytest.main(['test_fixture.py','-sq'])
初始化环境
打开网页
登陆操作
这是一个测试用例1,需要提前登陆
退出登陆
这是一个测试用例2,不需要提前登陆
登陆操作
这是一个测试用例3,需要提前登陆
退出登陆
关闭网页
这是一个测试用例4,不需要提前登陆
环境恢复
scope='session’的用法,多个.py文件同时使用
conftest.py
import pytest
@pytest.fixture(scope='session')
def Multiple():
print('open session')
yield
print('close session')
@pytest.fixture(scope='module')
def env():
print('初始化环境')
yield
print('环境恢复')
@pytest.fixture(scope='class')
def open():
print('打开网页')
yield
print('关闭网页')
@pytest.fixture(scope='function')
def login():
print('登陆操作')
yield
print('退出登陆')
test_f1.py
import pytest
class Testcase1:
def test_case1(self,login,open,env,Multiple):
print('这是一个测试用例1,需要提前登陆')
def test_case2(self,open):
print('这是一个测试用例2,不需要提前登陆')
def test_case3(self,login):
print('这是一个测试用例3,需要提前登陆')
class Testcase2:
def test_case4(self,env):
print('这是一个测试用例4,不需要提前登陆')
test_f2.py
class Testcase1:
def test_case5(self,Multiple):
print('这是一个测试用例5')
执行pytest -sq test_f1.py test_f2.py
open session
初始化环境
打开网页
登陆操作
这是一个测试用例1,需要提前登陆
.退出登陆
这是一个测试用例2,不需要提前登陆
.登陆操作
这是一个测试用例3,需要提前登陆
.退出登陆
关闭网页
这是一个测试用例4,不需要提前登陆
.环境恢复
这是一个测试用例5
.close session
conftest.py可以放前期操作,运行.py文件会先执行conftest.py,要和.py文件放在同一个包下面
使用@pytest.fixture(params=)定义
使用request接参数
request.param取出参数
conftest.py
import pytest
@pytest.fixture(params=[1,2,3])
def data(request):
print('参数化')
data=request.param
return data
#或者用yield data
test_f2.py
class Testcase1:
def test_case5(self,data):
print('这是一个测试用例')
print(f'获取传入数据{data}')