结合上一篇,补充fixture的用法
一、什么是fixture?
fixture属于pytest中的一种方法,可以用作测试用例的前置或后置操作,通过yield关键字进行区分。
代码在yield前面的属于前置操作,代码在yield后面的属于后置操作。可以只存在一种,如果有后置,一定会执行后置的代码
分析源码:
def fixture( # noqa: F811
fixture_function: Optional[_FixtureFunction] = None,
*,
scope: "Union[_Scope, Callable[[str, Config], _Scope]]" = "function",
params: Optional[Iterable[object]] = None,
autouse: bool = False,
ids: Optional[
Union[
Iterable[Union[None, str, float, int, bool]],
Callable[[Any], Optional[object]],
]
] = None,
name: Optional[str] = None
) -> Union[FixtureFunctionMarker, _FixtureFunction]:
fixture_marker = FixtureFunctionMarker(
scope=scope, params=params, autouse=autouse, ids=ids, name=name,
)
# Direct decoration.
if fixture_function:
return fixture_marker(fixture_function)
return fixture_marker
二、fixture参数列表:
scope:可以理解成fixture的作用域,默认:function,还有class、module、package、session四个【常用】
scope = "module",可实现多个.py 跨文件共享前置;只对里面生效,放conftest对包里所有文件生效
scope = "session",可实现多个.py 跨文件使用一个session完成多个用例
autouse:默认:False,需要用例手动调用该fixture; 如果是True,所有作用域内的测试用例都会自动调用该fixture;每个函数都想调用,可采用自动:@pytest.fixture(autouse=True)
name:默认:装饰器的名称,同一模块的fixture相互调用建议写个不同的name
注意:session的作用域:是整个测试会话,即开始执行pytest到结束测试
执行顺序:session>>module>>class>>function
三、多个fixture直接可以互相调用
用例异常后继续执行后置操作
前面提到过用例出现异常后,fixture继续执行后置操作。这里安静也距离给大家说明。
将上面的代码用例中加入断言内容,保证用例3断言失败,看看是否会执行后置操作(退出登录)。
三、fixture参数详解
1、参数name
import pytest
@pytest.fixture(name='anjing')
def login():
print('\n登录操作')
yield
print('\n退出登录!')
class Test_Login():
def test_01(self, anjing):
print('---用例01---')
def test_02(self):
print('---用例02---')
def test_03(self, anjing):
print('---用例03---')
if __name__ == '__main__':
pytest.main(['-vs'])
执行后发现,通过参数name更改过的名字可以直接进行调用。
注意:通过name重命名后,继续使用以前的名字调用会报错。
2、参数autouse:当每个函数都想调用,可采用自动
import pytest
@pytest.fixture(autouse=True)
def login():
print("===auto===")
class Test_Login():
def test_o1(self):
print("--自动登录--")
def test_o2(self):
print("--自动登录--")
if __name__ == '__main__':
pytest.main(['1super.py','-vs'])
3、params 表示fixture的参数化概念
import pytest
data = [12, 'ab']
@pytest.fixture(scope='class', params=data)
def login(request):
print("登录")
yield request.param
print("登出操作")
def test_case0(login):
print("testcase0")
class TestLogin:
def test_case1(self, login):
print("testcase1")
def test_case2(self, login):
print("testcase2")
if __name__ == '__main__':
pytest.main(['1super.py','-vs'])
4、ids表示在fixture对参数化的内容进行加上标识,默认是传参内容
import pytest
data = [12, 'ab']
@pytest.fixture(params=data,ids = ['ly=12','ly=ab'])
def login():
print("登录")
def test_case0(login):
print("testcase0")
if __name__ == '__main__':
pytest.main(['1super.py','-vs'])