领取资料,咨询答疑,请➕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_demoprint("这是一个测试demo。")
@pytest.fixture()有参数的进行定义
import pytest
@pytest.fixture(params=[1,2,3]) #fixture()带着parmas对ids()进行fixture函数的声明
def ids(request):data=request.paramprint(f'获取测试数据{data}')return data
def test_ids(ids): #调用fixture函数-ids()print(ids)
fixture源码如下
def fixture( # noqa: F811fixture_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