首页 > 其他分享 >精进单元测试技能——Pytest断言的艺术

精进单元测试技能——Pytest断言的艺术

时间:2024-01-07 10:31:43浏览次数:30  
标签:精进 断言 单元测试 assert Pytest result 测试 测试用例

本篇文章主要是阐述Pytest在断言方面的应用。让大家能够了解和掌握Pytest针对断言设计了多种功能以适应在不同测试场景上使用。


精进单元测试技能——Pytest断言的艺术_Pytest

了解断言的基础

在Pytest中,断言是通过 assert 语句来实现的。简单的断言通常用于验证预期值和实际值是否相等,例如:

def test_addition():
    result = add(2, 3)
    assert result == 5


然而除此之外,Pytest提供了更多丰富的断言方式,包括逻辑表达式、集合比较、异常捕获等,这些功能使得我们能够更全面地覆盖测试场景。

精进单元测试技能——Pytest断言的艺术_Pytest_02

利用逻辑表达式


Pytest的断言支持丰富的逻辑表达式,使得我们可以更灵活地组合多个条件。例如,我们可以使用 and ornot 等关键词来连接多个断言,从而实现更复杂的测试逻辑:

def test_complex_logic():
    result = some_complex_function()
    assert result > 0 and result % 2 == 0


通过充分利用逻辑表达式,我们能够在一个测试用例中覆盖多个相关的断言,从而提高测试的全面性和可读性。

精进单元测试技能——Pytest断言的艺术_Pytest_02

集合比较

在实际的测试中,有时我们需要比较集合之间的差异,Pytest提供了 assert set1 == set2 的方式来完成这样的比较。这对于验证返回的无序集合是否符合预期非常有用:

def test_set_comparison():
    result = get_some_data()
    expected_set = {1, 2, 3, 4, 5}
    assert set(result) == expected_set


通过集合比较,我们能够简洁而清晰地验证无序集合的相等性,确保测试的准确性。

精进单元测试技能——Pytest断言的艺术_Pytest_02

异常断言


在编写测试用例时,经常需要验证某个函数是否能够正确地抛出异常。Pytest提供了 pytest.raises 装饰器来实现异常断言:

import pytest




def test_exception():
    with pytest.raises(ValueError, match='Invalid value'):
        raise ValueError('Invalid value')

通过使用 pytest.raises,我们可以明确地指定期望的异常类型,并且可以通过 match 参数验证异常消息是否符合预期。这样的断言方式使得我们能够更精确地检查代码中的异常处理逻辑。

精进单元测试技能——Pytest断言的艺术_Pytest_02

定制断言函数

 为了提高测试用例的可维护性,我们可以考虑编写定制的断言函数,使得测试用例更加简洁而易读。例如,我们可以编写一个用于验证两个浮点数是否在一定误差范围内相等的断言函数:

def assert_float_equal(value1, value2, epsilnotallow=1e-6):
    assert abs(value1 - value2) < epsilon




def test_float_comparison():
    result = calculate_float()
    expected_result = 3.14159
    assert_float_equal(result, expected_result)


通过编写定制的断言函数,我们不仅能够提高测试用例的可读性,还能够在后续的维护过程中更轻松地调整断言逻辑。


精进单元测试技能——Pytest断言的艺术_Pytest_02

使用参数化测试


Pytest提供了参数化测试的功能,使得我们能够在同一个测试用例中使用不同的参数运行多次测试,进而提高测试的覆盖范围。结合参数化测试和断言,我们能够更全面地验证代码的不同输入组合。


import pytest




@pytest.mark.parametrize("input_data, expected_result", [
    ((2, 3), 5),
    ((-1, 1), 0),
    ((0, 0), 0),
])
def test_addition(input_data, expected_result):
    result = add(*input_data)
    assert result == expected_result


通过参数化测试,我们可以轻松地扩展测试用例,验证不同输入情况下的函数行为,而断言则保证了每个参数组合的准确性。


精进单元测试技能——Pytest断言的艺术_Pytest_02

结合文档和注释


在编写测试用例时,良好的文档和注释是确保测试易于理解和维护的关键。通过在测试用例中添加清晰的注释,解释每个断言的目的和期望结果,可以帮助其他开发者更容易地理解测试的目的。

def test_complex_behavior():
    # Ensure that the function behaves correctly in normal cases
    result = some_complex_function()
    assert result > 0




    # Ensure that a specific edge case is handled properly
    edge_result = some_complex_function(0)
    assert edge_result == 42

结合文档和注释,我们能够更清晰地传达测试的目的和预期,使得测试用例更易于维护和理解。

合理利用Pytest提供的断言方式是提高测试质量和效率的关键。通过深入了解不同的断言方式,并在实践中灵活应用,我们能够编写出更具表达力和可维护性的测试用例,从而提高代码的质量和稳定性。在日常的开发工作中,不断学习和掌握断言的艺术,将为我们打造高效而可靠的测试奠定坚实基础。

标签:精进,断言,单元测试,assert,Pytest,result,测试,测试用例
From: https://blog.51cto.com/summerstone/9132492

相关文章

  • 软件测试/测试开发/全日制|Pytest都有哪些命名规则?
    前言在使用Pytest进行测试时,良好的命名规范是编写清晰、易读和可维护的测试用例的重要组成部分。规范的命名使得测试用例的意图更加明确,便于团队成员理解和维护。本文就来给大家介绍一下pytest的命名规范。Pytest命名规范测试文件命名测试脚本文件为python文件,此外文件名命名规则为......
  • 软件测试/测试开发/全日制|pytest用例执行顺序,这篇文章就够了
    前言在使用unittest测试框架执行测试时,测试用例执行的顺序是默认按照ACSII码的顺序加载测试用例并执行,顺序为:0-9、A-Z、a-z,测试目录、测试模块、测试类、测试方法/测试函数都按照这个规则来加载测试用例。在有的时候,我们并不希望测试用例按照这样的规则来执行,pytest就可以让我们按......
  • 软件测试/测试开发/全日制|Pytest参数化神器,pytest.mark.parametrize()使用
    前言当我们要使用pytest输入多个数据对一个功能进行测试时,如果写多个测试用例的话,那就完全体现不出通过代码来执行测试的优势了,这个时候,就轮到pytest的参数化功能闪亮登场了。所谓参数化,就是就是把测试过程中的数据提取出来,通过参数传递不同的数据来驱动用例运行。其实也就是数据驱......
  • Pytest07-pytest.ini配置文件
    1.pytest配置文件固定名称:pytest.ini作用域:当前目录及子目录具体配置功能见下:[pytest]#01把命令行参数自动添加到这里addopts=-s-v--html=./report/report2023.html#02指定执行的用例的目录testpaths=./script#03修改默认的测试文件名规则python_files=au......
  • Python+Requests+PyTest+Excel+Allure 接口自动化测试实战
    本文主要介绍了Python+Requess+PyTest+Excel+Allure接口自动化测试实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧Unittest是Python标准库中自带的单元测试框架,Unittest有时候也被称为PyUnit,就像JUnit......
  • Pytest06-pytest的setup和teardown函数
    高清B站视频链接pytest的setup和teardown函数用例前置和后置#类外面setup_module/teardown_module:在当前文件中,所有的用例执行之前以及之后执行setup_function/teardown_function:在每个测试函数之前以及之后执行setup/teardown:在每个测试函数之前以及之后执行#类里面......
  • Jest之单元测试入门
    一,测试平台1,使用nodejs工程二,准备工作1,npminstalljestsave-dev2,package.json的配置三,开始编写测试代码1,sum.js:业务逻辑代码(被测试)module.exports.sum=function(a,b){returna+b;}2,sun.test.js:测试代码,用于测试sum.js2.1,注意:一定要使用test.jsconstsum......
  • 软件测试/测试开发全日制培训|Pytest跳过用例和失败重试
    前言在我们日常进行自动化测试时,经常会遇到功能阻塞,未实现或者环境有问题等等原因,一些用例执行不了,如果我们注释掉或删除掉这些测试用例,后面可能还要进行恢复操作,这个时候pytest的跳过测试功能就能帮助我们,先跳过,等到问题解决时,恢复执行即可;同时我们还有可能会遇到需要对失败用例重......
  • 软件测试/测试开发|什么是pytest,我们为什么选择pytest?
    前言作为一个程序猿,免不了要为自己写的代码做单元测试,因为我是一个Pythoner,所以最开始用的是unittest测试框架,但是我的使用体验很不好,后面我了解到了pytest,简直能把uinttest秒成渣,在这里和大家一起分享下pytest使用经验,本文先来给大家介绍一下pytest以及它如何安装,运行一下最简单的......
  • pytest自动化测试中的fixture的声明和调用
    1.fixture的声明我们使用@pytest.fixture()来声明fixture函数。fixture()即可无参数进行声明,也可以带参数声明。示例1:@pytest.fixture()无参数进行声明[email protected]#fixture()未带任何参数,声明一个fixture函数deffixture_demo():print("这个是一......