pytest-addfinlizer终结函数

前言

在pytest中想要做teardown的处理,除了使用带有yield的fixture函数外,还可以添加终结器(addfinlizer),request.addfinlizer将函数变为终结函数

终结函数实现:定义fixture函数,前部分为前置setup的操作,在定义一个函数用来实现后置teardown,然后再在fixture中使用request.addfinalizer(teardown函数名),那么将这个fixture应用到测试用例中,即可实现跟yield一样的前后置效果,如果需要传参给用例,则需要return来返回

 

示例代码

1、终结函数的添加代码示例:

import pytest

@pytest.fixture()
def test_addfinalizer(request):
    #前置操作setup
    print('===打开浏览器==')
    test = 'test_addfinalizer'

    def fin():
        #后置操作teardown
        print('==关闭浏览器==')
    #将fin注册为终结函数
    request.addfinalizer(fin)
    #返回前置操作的变量
    return test

def test_anthor(test_addfinalizer):
    print('最新用例',test_addfinalizer)

输出结果:

 

 

 2、fixture的yield实现后置代码

import pytest

@pytest.fixture()
def test_addfinalizer():
    #前置操作setup
    print('===打开浏览器==')
    test = 'test_addfinalizer'
    yield test
    print('==关闭浏览器==')

def test_anthor(test_addfinalizer):
    print('最新用例',test_addfinalizer)

输出结果:

 

 

 两个打印对比可以看到,终结函数里打印确实是在测试用例执行完成后打印的,跟yield后置代码实现的效果是一样的

 

3、注册多个终结函数

可以支持多个终结函数注册,执行顺序:后注册的先执行,先注册的后执行

代码如下:

import pytest

@pytest.fixture()
def test_addfinalizer(request):
    #前置操作setup
    print('===打开浏览器==')
    test = 'test_addfinalizer'
    # yield test
    # print('==关闭浏览器==')

    def fin():
        #后置操作teardown
        print('==关闭浏览器==')
    #也可以支持多个终结函数注册,执行顺序:后注册的先执行,先注册的后执行
    def fin2():
        print('==再次关闭浏览器==')
    #将fin注册为终结函数
    request.addfinalizer(fin)
    #将fin2注册为终结函数
    request.addfinalizer(fin2)
    #返回前置操作的变量
    return test

def test_anthor(test_addfinalizer):
    print('最新用例',test_addfinalizer)

输出结果:

 

 

4、区别

yield和addfinalizer实现的后置还是存在区别的,比如在发生异常的时候

import pytest

@pytest.fixture()
def log():
    print('需要输入密码')
    yield
    assert 1 == 2
    print('登陆成功')

def test_01(log):
    print('test_01执行')

@pytest.fixture()
def test_addfinalizer(request):
    #前置操作setup
    print('===打开浏览器==')
    test = 'test_addfinalizer'

    def fin():
        #后置操作teardown
        print('==关闭浏览器==')
    #也可以支持多个终结函数注册,执行顺序:后注册的先执行,先注册的后执行
    def fin2():
        print('==再次关闭浏览器==')
    #将fin注册为终结函数
    request.addfinalizer(fin)
    #将fin2注册为终结函数
    request.addfinalizer(fin2)
    # 除setup以外部分发生异常,仍是会继续执行addfinalizer(也就是后置代码),但测试用例代码则不会执行
    assert 1 == 2
    #返回前置操作的变量
    return test


def test_anthor(test_addfinalizer):
    print('最新用例',test_addfinalizer)

输出打印:

 

 

 以上异常都发生在teardown部分,从打印结果分析:

1、yield:前置以及测试用例的部分打印都已输出,但后置部分异常代码后的打印并未执行

2、addfinalizer:异常发生在注册终结函数后,前、后置打印都已经输出,但测试用例的打印并未输出

总结:

yield和addfinalizer区别:

共同点:setup代码发生异常,后面部分都不执行
不同点:只要addfinalizer注册成功,除setup以外部分发生异常,仍是会继续执行addfinalizer(也就是后置代码),但测试用例代码则不会执行,。而yeild后面发生异常,就不会继续执行yield异常后的代码,但测试用例代码仍会执行

 

posted @ 2023-03-01 15:32  测试-13  阅读(245)  评论(0编辑  收藏  举报