fixture
优势:
- pytest的fixture命名不在局限于setup和teardown命名方式
- 所有的fixture都可以一个conftest.py的文件中,供所有测试用例使用
fixture 创建和使用方法
fixture 创建
#1. @pytest.fixture()
#2. 编写一个普通函数
@pytest.fixture()
def login():
print("执行登录")
fixture 使用
#在需要使用fixture的测试用例中,当做参数传入即可
def test_shopping(login):
print("测试购物")
使用一个fixture来实现setup和teardown
语法:yield 关键字
@pytest.fixture()
def login():
print("打开浏览器,登录成功")
yield #用例执行成功后执行,相当于teardown
print("关闭浏览器")
def test(login): #相当于setup在test用例前执行
print("执行")
yield 遇到异常
1.不会影响后续用例的执行
2.当用例执行完之后,会执行yield后面的代码,但不能return
addfinalizer这个实现功能跟yield一样,可以return参数。传给后面用例,示例:
import pytest
#创建fixture
def open(request):
driver=webdriver.chrome()
print("打开浏览器")
def end():
driver.quit()
request.addfinalizer(end) #终结函数 --作用和yield一样
return driver
def test.baidu(open):
open.get("http://www.baidu.com")
title=open.title
print("标题",title)
_fixture其他方法使用
1.fixture 返回值
2.fixture 参数化
@pytest.fixture(params:[1,2,3])
def need_data(request): #传入参数params
return request.param #取列表中单个值
class Test_ABC:
def test_a(self,need_data):
print("---------------------test_a")
assert need_data !=3 #断言need_data不等于3
使用装饰器引用fixture
import pytest
@pytest.fixture() #fixture标记的函数可以应用于测试类外部
def before():
print("------------before")
@pytest.mark.usefixture("before")
class Test_ABC:
def setup(self):
print("---------setup")
def test_a(self):
print("-------test_a")
assert 1
fixture(scope=“function”,params=None,autouse=False,ids=None,name=None)
优势:(fixture相对于setup和teardown来说应该有以下几点优势)
- 命名方式灵活,不局限于setup和teardown这几个命名
- conftest.py 配置里可以实现数据共享,不需要import就能自动找到一些配置
- scope = “module” 可以实现多个.py跨文件共享前置,每个.py文件调用一次
- scope = “session” 可以实现多个.py跨文件使用一个session来完成多个用例