pytest-fixture3种调用方式

Pytest的fixture 3种调用方式

直接进入正题,fixture有以下3种调用方式:

1、传参:将fixture名称作为测试用例函数的输入参数
2、装饰器:在测试用例类或者函数加上装饰器@pytest.mark.usefixtures(fixture_name)
3、autouse:fixture将autouse参数设置True

那么以下直接来一一介绍

方法1:传参:将fixture名称作为测试用例函数的输入参数

可以传多个fixture参数,先执行的在前,后执行的在后 

import pytest

@pytest.fixture()
def login():
    print('请输入账号密码')

@pytest.fixture()
def login2():
    print('请输入验证码')

def test_01(login,login2):
    print('登陆成功')

def test_02():
    print('无需登陆')

  输出结果:

从输出打印可以看出,在前fixture的login先执行打印,后fixture的login2再执行打印

 

方法2:装饰器:在测试用例类或者函数加上装饰器@pytest.mark.usefixtures(fixture_name)

可以设置多个@pytest.mark.usefixtures(),先执行的放底层,后执行的放上层

import pytest

@pytest.fixture()
def login():
    print('请输入账号密码')

@pytest.fixture()
def login2():
    print('请输入验证码')

@pytest.mark.usefixtures('login2')
@pytest.mark.usefixtures('login')
def test_03():
    print('用例三:登陆成功')

 输出结果:

从输出打印可以看出,在下fixture的login装饰器先执行打印,后fixture的login2装饰器再执行打印

同时pytest.mark.usefixtures装饰器可以设置在测试类上,在测试类声明上加@pytest.mark.usefixtures(),代表这个类里面所有测试用例都会调用该fixture(仅限作用域为function,即scope=function或者默认),如果scope=class,类级别的只调用一次,代码如下:

import pytest

@pytest.fixture()
def login():
    print('请输入账号密码')

@pytest.mark.usefixtures('login')
class Test_01():
    def test_04(self):
        print('用例4:需要登陆')

    def test_05(self):
        print('用例5:不需要登陆')

 输出结果:

 测试用例test04,test05都执行了login的打印,证明在测试类上设置@pytest.mark.usefixtures()装饰器也能起到作用

 

方法3:autouse:fixture将autouse参数设置True

当前模块(py)下所有的测试用例都会默认执行该fixture

import pytest

@pytest.fixture(autouse=True)
def login2():
    print('请输入验证码')

def test_01():
    print('登陆成功')

def test_02():
    print('无需登陆')

class Test_01():
    def test_04(self):
        print('用例4:需要登陆')

    def test_05(self):
        print('用例5:不需要登陆')

 输出结果:

 可以看到不管是类中测试用例还是类外测试用例,只要是当前模块的都执行了fixture(login)

扩展:

1、如果fixture有返回值,用@pytest.mark.usrfixtures()是无法获取到返回值的,会直接提示报错,必须用传参的方式

@pytest.fixture()
def login():
    print('登陆界面')
    a = 123
    yield a

@pytest.mark.usefixtures(login)
def test_01():
    print(f'返回的数值:{login}')

 上面是用@pytest.mark.usrfixtures()调用login,测试用例直接打印login返回的值,输出结果如下:

 

 pytest直接提示error并退出执行,可以看到无法正常调用,那么接下来用传参方式试下:

@pytest.fixture()
def login():
    print('登陆界面')
    a = 123
    yield a

def test_01(login):
    print(f'返回的数值:{login}')

 输出结果:

 传参方式调用fixture,返回的参数是可以正常获取到的。这是今后需要值得注意的地方

2、fixture里面可以在调用另一个fixture,调用顺序:先执行内层调用的fixture,后执行外层的fixture

@pytest.fixture()
def login():
    print('login的调用')

@pytest.fixture()
def login2(login):
    print('login2的调用')

def test(login2):
    print('test执行')

 输出结果:

 

以上就是fixture的调用方式,之后对fixture的使用有更好的理解

 

posted @ 2023-02-28 11:24  测试-13  阅读(623)  评论(0编辑  收藏  举报