软件测试/测试开发全日制培训|Pytest的异常处理

简介: 软件测试/测试开发全日制培训|Pytest的异常处理

前言

在断言一些代码块或者函数时会引发意料之中的异常或者其他失败的异常导致程序无法运行时,使用raises捕获匹配到的异常可以让代码继续运行。

Python的异常处理:try...except...else...finally...,示例如下:

try:
    print("正常的操作")
except TypeError:
    print("发生TypeError异常,执行这块代码")
    raise           # 并抛出这个异常
except:
    print("发生未知异常,执行这块代码")
else:
    print("如果没有异常执行这块代码有异常发生")
finally:
    print("退出try时总会执行")

Pytest的异常处理:pytest.raises

pytest.raiseswith语句一起使用,成功断言到期望异常则测试通过,未断言到期望异常则测试失败,如下代码中, with语句范围断言到期望异常TypeError - 测试通过示例代码如下:

import pytest


def test_01():
    with pytest.raises(TypeError) as e:
        raise TypeError
    print("2+2=4")


if __name__ == '__main__':
    pytest.main(["test_a.py", "-s"])

----------
执行结果如下:
============================= test session starts =============================
collecting ... collected 1 item

test_a.py::test_01 PASSED                                                [100%]2+2=4


============================== 1 passed in 0.02s ==============================

如下代码中, with语句范围未断言到期望TypeError - 测试失败

import pytest


def test_02():
    with pytest.raises(TypeError) as e:
        print("4-2=2")
    print("1+2=3")

if __name__ == '__main__':
    pytest.main(["test_a.py", "-s"])
-----------------
运行结果如下:
============================= test session starts =============================
collecting ... collected 1 item

test_a.py::test_02 FAILED                                                [100%]4-2=2

test_a.py:29 (test_02)
def test_02():
        with pytest.raises(TypeError) as e:
>           print("4-2=2")
E           Failed: DID NOT RAISE <class 'TypeError'>

test_a.py:32: Failed


============================== 1 failed in 0.05s ==============================

如果我们不知道预期异常的是什么,我们可以使用match和raise进行自定义异常,如下:

import pytest

def exc(x):
    if x == 0:
        raise ValueError("value not 0 or None")
    return 2 / x

def test_raises():
    with pytest.raises(ValueError, match="value not 0 or None"):
        exc(0)
    assert eval("1 + 2") == 3

if __name__ == '__main__':
    pytest.main(["test_a.py", "-s"])

match还可以使用正则表达式进行匹配异常,如下:

with pytest.raises(ValueError, match=r"value not \d+$"):
    raise ValueError("value not 0")

使用assert语句进行断言

assert是Python中用于检查条件是否满足的关键字。在pytest中,assert语句是异常断言的基础。当条件不满足时,assert会引发AssertionError异常,这有助于检测程序中的错误。例如:

def test_something():
    assert 2 + 2 == 4, "计算错误"

使用try...except块捕获异常

除了asserttry...except是另一种处理异常的重要方式。在测试中,try...except可以用来捕获并处理预期的异常。例如:

def test_exception_handling():
    try:
        # 可能引发异常的代码
        result = 10 / 0
    except ZeroDivisionError:
        # 异常处理代码
        assert True, "除数不能为零"

使用pytest.raises检查异常

pytest.raises是pytest提供的一个工具,用于检查是否引发了预期的异常。它可以方便地验证函数是否抛出了特定类型的异常。例如:

import pytest

def test_exception():
    with pytest.raises(ValueError):
        raise ValueError

结合使用异常处理和断言进行测试

在实际的测试中,通常需要结合使用异常处理和断言来确保代码在异常情况下的行为符合预期。以下是一个结合使用try...exceptassert的示例:

def divide(x, y):
    try:
        result = x / y
    except ZeroDivisionError:
        return None
    return result

def test_divide_by_zero():
    assert divide(10, 0) is None, "除数不能为零时应返回None"

在这个例子中,test_divide_by_zero测试函数使用assert来验证divide函数在除数为零时是否返回了None。

总结

pytest提供了多种方法来处理异常和断言,确保代码的正确性和稳定性。通过结合使用assert语句、try...except块和pytest.raises工具,你可以更有效地测试你的Python代码,并且在出现异常时能够进行适当的处理。

相关文章
|
11天前
|
测试技术 UED Python
探索软件测试的边界:自动化与手动测试的协同
【8月更文挑战第59天】在追求效率和质量的软件生产中,自动化测试与手动测试的辩论从未停止。本文将通过实际案例,揭示二者如何相辅相成,共同构建更健壮的软件测试体系。我们将深入探讨自动化测试的优势、手动测试不可替代的角色以及它们如何在实际项目中协同工作,旨在为读者提供一种平衡的视角来看待软件测试的实践。
106 65
|
3天前
|
机器学习/深度学习 存储 监控
深入解析软件测试中的自动化测试技术
本文旨在全面探讨软件测试中的自动化测试技术。通过对自动化测试的定义、优势、常见工具和实施步骤的详细阐述,帮助读者更好地理解和应用自动化测试。同时,本文还将讨论自动化测试的局限性及未来发展趋势,为软件测试人员提供有益的参考。
17 6
|
5天前
|
机器学习/深度学习 人工智能 自然语言处理
软件测试中的人工智能革命:提升测试效率与质量的新篇章
随着人工智能技术的不断成熟,其在软件测试领域的应用正逐渐改变传统测试方式。本文将探讨AI在软件测试中的应用现状、优势以及面临的挑战,并通过具体案例分析展示AI如何提高测试效率和质量。最后,我们将讨论未来AI在软件测试中的发展趋势及其对人类测试工程师角色的影响。
|
6天前
|
设计模式 敏捷开发 jenkins
软件测试中的自动化测试实践指南
本文旨在探讨软件测试中自动化测试的实施方法及其重要性,通过具体案例分析自动化测试的步骤、工具选择及最佳实践。我们将从自动化测试的基本概念入手,逐步解析其在实际项目中的应用,并提供一些常见问题的解决方案。
|
10天前
|
机器学习/深度学习 人工智能 安全
软件测试中的探索性测试:一种高效发现软件缺陷的方法
本文将深入探讨软件测试中的一种关键方法——探索性测试。探索性测试是一种动态的、探索性的软件测试方法,它依赖于测试人员的直觉和经验,通过实际操作软件来发现潜在的问题和缺陷。与传统的基于预定义用例的测试方法相比,探索性测试更加灵活,能够更全面地覆盖软件的各个方面,从而更有效地发现难以预见的错误和漏洞。
|
12天前
|
监控 中间件 测试技术
『软件测试5』测开岗只要求会黑白盒测试?NO!还要学会性能测试!
该文章指出软件测试工程师不仅需要掌握黑盒和白盒测试,还应该了解性能测试的重要性及其实现方法,包括负载测试、压力测试等多种性能测试类型及其在保证软件质量中的作用。
『软件测试5』测开岗只要求会黑白盒测试?NO!还要学会性能测试!
|
12天前
|
测试技术 程序员 C语言
『软件测试4』耗子尾汁!2021年了,你还不知道这4种白盒测试方法吗?
该文章深入介绍了四种常用的白盒测试方法,包括语句覆盖、判定覆盖、条件覆盖以及路径覆盖,并探讨了这些方法在软件测试中的应用。
『软件测试4』耗子尾汁!2021年了,你还不知道这4种白盒测试方法吗?
|
12天前
|
机器学习/深度学习 Web App开发 测试技术
『软件测试3』八大典型的黑盒测试方法已来袭,快快接住!
该文章介绍了八种常用的黑盒测试方法,包括等价类划分、边界值分析、错误推测法、因果图法、决策表测试、状态转换法、场景法以及随机测试,并提供了相应的案例说明。
|
12天前
|
测试技术 数据库
『软件测试2』 关于黑盒测试和测试用例的基础知识
该文章讲解了黑盒测试的基本概念以及如何编写有效的测试用例,包括选择合适的输入数据、预期结果的设定和测试执行的步骤。
|
12天前
|
监控 安全 测试技术
『软件测试1』你需要了解的软件测试基础知识
该文章介绍了软件测试的基础知识,涵盖了软件缺陷的定义、类型、处理流程以及软件测试的目标和重要性等内容。