pytest教程-11-初识fixture

领取资料,咨询答疑,请➕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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值