pytest之fixture的使用

一、测试固件(fixture)是在执行测试用例前执行(setup)和后执行(teardown)的代码块。pytest提供了两种方式,分别是setup_function,setup_class,setup_method,setup_module和@pytest.fixture()装饰器装饰自定义的测试固件的两种方式,这里记录第二种方式的使用方法

1、fixture之间的调用(执行测试用例比较耗时),只需要在调用者mprint函数的参数中加上被调用者number函数的函数名,而测试用例test_02的参数加上测试固件mprint函数名。对于有返回值的测试固件,测试用例若想要使用直接在测试代码中调用测试用例的参数即可,可以理解成测试用例的参数等于其测试固件的返回值(多个返回值存放在tuple中)。特别注意,例子中被调用者number函数有返回值,调用者mprint返回number,两个测试固件的返回值均为同一个,但在测试用例中使用返回值时的写法不同。

测试固件代码如下:

import pytest
from page.page_add import NumberAdd

@pytest.fixture(scope='function')
def number():
    number = NumberAdd()
    return number

@pytest.fixture(scope='function')
def mprint(request, number):
    print('setup每个函数执行:开始执行测试用例')

    def teardown():
        print('teardown每个函数执行:结束执行测试用例')

    request.addfinalizer(teardown)
    return number

测试用例代码如下:

def test_add_01(number):
    """数字算法:两个正整数相加"""
    data = number.add_num(1, 2)
    assert data == 3

def test_02(mprint):
    data = mprint.add_num(2,2)
    assert data == 4

2、测试用例调用多个fixture(比上面的例子执行时间短0.5s),两个fiixture互不影响。上面的例子可以将fixture之间的调用拆开写,测试用例调用测试固件时,在测试用例的参数加上测试fixture名(参数位置没有影响)即可。

测试固件代码如下:

import pytest
from page.page_add import NumberAdd

@pytest.fixture(scope='function')
def number():
    number = NumberAdd()
    return number

@pytest.fixture(scope='function')
def mprint(request):
    print('setup每个函数执行:开始执行测试用例')

    def teardown():
        print('teardown每个函数执行:结束执行测试用例')

    request.addfinalizer(teardown)

测试用例代码如下:

def test_add_01(number):
    """数字算法:两个正整数相加"""
    data = number.add_num(1, 2)
    assert data == 3

def test_02(mprint,number):
    data = number.add_num(2,2)
    assert data == 4

 

posted @ 2019-08-13 11:54  vevian  阅读(393)  评论(0)    收藏  举报