首页 > 其他分享 >软件测试/测试开发全日制培训|Pytest的异常处理

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

时间:2024-01-10 18:02:09浏览次数:31  
标签:__ 全日制 pytest assert Pytest raises test 异常 软件测试

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

前言

在断言一些代码块或者函数时会引发意料之中的异常或者其他失败的异常导致程序无法运行时,使用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代码,并且在出现异常时能够进行适当的处理。


标签:__,全日制,pytest,assert,Pytest,raises,test,异常,软件测试
From: https://blog.51cto.com/u_15640304/9183701

相关文章

  • 软件测试/测试开发全日制|Pytest结合yaml实现数据驱动
    前言我们之前介绍过pytest的参数化,我们使用了@pytest.mark.parametrize(argnames,argvalues)来实现批量传送参数的目的,但是我们不进行数据驱动的话,我们一旦对数据进行变更,就需要在代码里对我们的参数进行逐一的修改,这对我们来说,是额外增加的工作量,而通过专门存储数据的文件来实现......
  • 软件测试/测试开发全日制|Pytest结合Excel实现数据驱动
    前言数据驱动测试是一种有效的测试方法,可以使用不同的输入数据运行相同的测试用例。结合pytest和Excel表格可以方便地实现数据驱动测试。在这篇文章中,我们将介绍如何使用pytest和Excel实现数据驱动测试。环境准备在实现Excel的数据驱动之前,我们首先要安装Python操作excel的第三方库......
  • 软件测试分析报告
    ......
  • 软件测试/测试开发/全日制|Pytest测试用例调度与运行
    前言Pytest是一个功能强大的Python测试框架,它具有灵活的测试用例调度和运行机制。在本文中,我们将深入了解Pytest是如何收集、选取和运行测试用例的。测试用例的收集在Pytest中,测试用例是通过函数来表示的。为了进行测试,Pytest需要收集这些测试函数。默认情况下,Pytest会在......
  • 软件测试/人工智能/全日制测试开发|利用ChatGPT自动生成自动化测试脚本
    自动化测试是软件测试过程中不可或缺的一部分,它能够提高测试效率,减少测试成本,保障软件质量。然而,编写和维护自动化测试脚本仍然是一个具有挑战性的任务,需要花费大量的时间和精力。学会借助ChatGPT自动生成自动化测试脚本,就可以减少编写自动化脚本的工作量,提高测试效率。如何借助Cha......
  • 软件测试计划
    ......
  • 软件测试/测试开发/全日制 |你知道该如何制定合理的职业规划吗?
    职业规划是每个职场人士都需要认真思考和制定的重要事项。无论你是刚入职场的新人,还是在职业生涯中迈入新的阶段,都需要有清晰的目标和规划,以更好地实现个人职业发展。我们为您提供了一个绝佳的机会参加【职业规划公开课】,让您从中受益匪浅。【职业规划公开课】即将开讲,我们邀请了霍......
  • 深入了解Pytest中的Mocking:简化测试,避免依赖问题
    在软件开发中,测试是确保代码质量的关键步骤之一。而在测试中,经常需要模拟(Mock)一些对象或函数,以确保测试的独立性和可靠性。在Pytest中,Mocking是一个强大的工具,能够简化测试过程,避免对外部依赖的影响。什么是Mocking?Mocking是一种用于测试的技术,它允许我们替代实际对象或函数,以便模......
  • 软件测试/测试开发/全日制|pytest如何标记测试用例
    前言在pytest中,有时候我们并不需要对所有的用例全部执行。pytest提供了一种机制:有选择的挑选用例去执行,即标记测试函数。下面详细介绍几种方法给函数标记。使用pytest.mark在函数上进行标记标记格式@表示这是一个装饰器,pytest.mark是pytest固定的写法,mark_name可以使用自定义标记......
  • 软件测试/测试开发全日制培训|Pytest跳过用例和失败重试
    前言在我们日常进行自动化测试时,经常会遇到功能阻塞,未实现或者环境有问题等等原因,一些用例执行不了,如果我们注释掉或删除掉这些测试用例,后面可能还要进行恢复操作,这个时候pytest的跳过测试功能就能帮助我们,先跳过,等到问题解决时,恢复执行即可;同时我们还有可能会遇到需要对失败用例重......