领取资料,咨询答疑,请➕wei: June__Go
上一小节我们学习了使用allure生成html测试报告的方法,本小节我们讲解一下pytest fixture测试夹具的使用方法。
前言
在做自动化的过程中,编写用例时候需要用到用例的前置和用例的后置,其中pytest中有setup_class和teardown_class可以帮助我们完成这些,但是不够完善而且灵活性不够强。举个简单的例子,一个calss中有3条用例,其中2条需要登录,1条不需要登录,这个时候如果在用setup和teardown来做就有点不方便。这个时候就引入了新的知识点fixture。
fixture介绍
fixture是pytest精髓所在,就像unittest中的setup和teardown一样,但相对之下它的功能更加强大和灵活。
fixture的作用
1.做测试前后的初始化设置,如测试数据准备,链接数据库,打开浏览器等这些操作都可以使用fixture来实现
2.测试用例的前置条件可以使用fixture实现
3.支持经典的xunit fixture ,像unittest使用的setup和teardown
4.fixture可以实现unittest不能实现的功能,比如unittest中的测试用例和测试用例之间是无法传递参数和数据的,但是fixture却可以解决这个问题
fixture的定义和源码
我们使用@pytest.fixture()来定义fixture函数。fixture()即可无参数进行定义,也可以带参数定义。
@pytest.fixture()无参数进行定义
import pytest
@pytest.fixture #fixture()未带任何参数,声明一个fixture函数
def fixture_demo():
print("这个是一个fixture的demo演示")
def test_demo(fixture_demo): #调用fixture函数——fixture_demo
print("这是一个测试demo。")
@pytest.fixture()有参数的进行定义
import pytest
@pytest.fixture(params=[1,2,3]) #fixture()带着parmas对ids()进行fixture函数的声明
def ids(request):
data=request.param
print(f'获取测试数据{data}')
return data
def test_ids(ids): #调用fixture函数-ids()
print(ids)
fixture源码如下
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中一共有5个参数分别是:
- scope:fixture的作用域,默认为function;
- params:fixture的参数
- autouse:默认:False,需要用例手动调用该fixture;如果是True,所有作用域内的测试用例都会自动调用该fixture;
- ids: fixture参数进行id化命名
- name:装饰器的名称,同一模块的fixture相互调用建议写不同的name。
fixture调用
调用fixture有三种方式
1、在测试用例中直接调用
将fixture名称作为参数传入测试用例,如果fixture有返回值,那么测试用例将会接收返回值。
import pytest
@pytest.fixture()
def fixtureFunc():
return 'fixtureFunc'
def test_fixture(fixtureFunc):
print('我调用了{}'.format(fixtureFunc))
class TestFixture(object):
def test_fixture_class(self, fixtureFunc):
print('在类中使用fixture "{}"'.format(fixtureFunc))
if __name__=='__main__':
pytest.main(['-s', 'test_fixture.py'])
2、使用@pytest.mark.usefixtures('fixture')装饰器
每个函数或者类前使用@pytest.mark.usefixtures('fixture')装饰器装饰
import pytest
@pytest.fixture()
def fixtureFunc():
print('\n fixture->fixtureFunc')
@pytest.mark.usefixtures('fixtureFunc')
def test_fixture():
print('in test_fixture')
@pytest.mark.usefixtures('fixtureFunc')
class TestFixture(object):
def test_fixture_class(self):
print('in class with text_fixture_class')
if __name__=='__main__':
pytest.main(['-s', 'test_fixture.py'])
3、 使用autouse参数
指定fixture的参数autouse=True这样每个测试用例会自动调用fixture(其实这里说的不是很准确,因为还涉及到fixture的作用范围,那么我们这里默认是函数级别的,后面会具体说fixture的作用范围)
import pytest
@pytest.fixture(autouse=True)
def fixtureFunc():
print('\n fixture->fixtureFunc')
def test_fixture():
print('in test_fixture')
class TestFixture(object):
def test_fixture_class(self):
print('in class with text_fixture_class')
if __name__=='__main__':
pytest.main(['-v', 'test_fixture.py'])
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走,希望可以帮助到大家!领取资料,咨询答疑,请➕wei: June__Go