pytest快速入门 - 如何确保后置条件完全执行(测试人员必知必会)

目录<<上一章:构造“后置条件”的几种方式下一章:测试用例执行超时研究(测试人员必知必会)>>

1 pytest自动化测试 - 如何确保后置条件完全执行

1.1 背景

  测试过程中有一个比较麻烦的事,就是用例执行完成后,进行收尾工作时,执行清理数据的语句异常,导致后面的清理语句都不执行了,这是不能接受的,会很快导致整个测试环境陷入混乱,严重影响测试效率和测试进度
  如何避免这种情况?很基本的宗旨就是,后置条件的每条语句都要执行,哪怕中间有语句异常中止了!
  以下介绍几种有效的方法来确保后置条件的有效执行!

1.1.1 使用try...except...确保后置条件执行完整性

import pytest

@pytest.fixture
def resource():
    data = 123 # 初始化资源(如数据库连接)
    try:
        yield data
    finally:
        try:
            1 / 0  # 无论是否异常,都会执行
        except Exception as e:
            print(f"\n清理步骤1失败: {e}")
        try:
            2 / 0  # 继续执行下一步清理
        except Exception as e:
            print(f"清理步骤2失败: {e}")

def test_teardown_001_001(resource):
    assert resource == 123

  每个后置条件语句都使用try...except进行保护,可以确保所有后置条件都会执行,缺点是比较麻烦,每个后置条件都要写try...except

1.1.2 使用request.addfinalizer

  使用addfinalizer添加的后置条件,后置条件之间不会影响,即使有1个后置条件出现异常,其他后置条件也会执行。

import pytest

@pytest.fixture
def resource_fixture(request):
    # 前置条件:模拟资源创建
    resource = "Some resource"
    def _cleanup_1():
        # 后置条件:模拟资源销毁
        print("后置条件1.")
        1 / 0

    def _cleanup_2():
        # 后置条件:模拟资源销毁
        print("后置条件2.")

    def _cleanup_3():
        # 后置条件:模拟资源销毁
        print("后置条件3.")

    request.addfinalizer(_cleanup_1)
    request.addfinalizer(_cleanup_2)
    request.addfinalizer(_cleanup_3)
    
    yield resource
    print()

def test_with_addfinalizer(resource_fixture):
    assert resource_fixture == "Some resource"

输出:

============================= test session starts =============================
platform win32 -- Python 3.13.1, pytest-8.3.4, pluggy-1.5.0
rootdir: D:\TYYSOFT\Study\Python\pytest
configfile: pytest.ini
plugins: check-2.4.1, html-4.1.1, metadata-3.1.1
collected 1 item

test_teardown_consist_003.py .
后置条件3.
后置条件2.
后置条件1.
E

=================================== ERRORS ====================================
_________________ ERROR at teardown of test_with_addfinalizer _________________

    def _cleanup_1():
        # 后置条件:模拟资源销毁
        print("后置条件1.")
>       1 / 0
E       ZeroDivisionError: division by zero

test_teardown_consist_003.py:10: ZeroDivisionError
-- Generated html report: file:///D:/TYYSOFT/Study/Python/pytest/report.html --
=========================== short test summary info ===========================
ERROR test_teardown_consist_003.py::test_with_addfinalizer - ZeroDivisionErro...
========================= 1 passed, 1 error in 0.08s ==========================

注意:addfinalizer函数添加的后置条件,执行顺序是反的,如果您的后置条件执行顺序有依赖,请注意添加顺序!

1.1.3 使用eval函数实现多个后置条件的执行

  将要执行的后置条件语句写在列表中,遍历执行列表即可保证后置条件都被执行。如下的代码中,每个后置条件都有异常,但并不会中断。

import pytest

def _teardown_1():
    print("后置1")
    1 / 0

def _teardown_2():
    print("后置2")
    2 / 0
    
def _teardown_3():
    print("后置3")
    3 / 0

teardown_list = [
    r"_teardown_1()", 
    r"_teardown_2()", 
    r"_teardown_3()"
]

def teardown_function():
    print()
    for x in teardown_list:
        try:
            eval(x)
        except Exception as e:
            pass

def test_teardown_001():
    assert sum([1,2,3]) == 6

输出:

============================= test session starts =============================
platform win32 -- Python 3.13.1, pytest-8.3.4, pluggy-1.5.0
rootdir: D:\TYYSOFT\Study\Python\pytest
configfile: pytest.ini
plugins: check-2.4.1, html-4.1.1, metadata-3.1.1
collected 1 item

test_teardown_consist_002.py .
后置1
后置2
后置3


-- Generated html report: file:///D:/TYYSOFT/Study/Python/pytest/report.html --
============================== 1 passed in 0.02s ==============================

从报文中可以看到, 每个后置条件语句都被执行了。


作者声明:本文用于记录和分享作者的学习心得,可能有部分文字或示例来源自豆包AI,由于本人水平有限,难免存在表达错误,欢迎留言交流和指教!
Copyright © 2022~2025 All rights reserved.

目录<<上一章:构造“后置条件”的几种方式下一章:测试用例执行超时研究(测试人员必知必会)>>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值