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