[Python] 断言assert与单元测试

这篇具有很好参考价值的文章主要介绍了[Python] 断言assert与单元测试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、概念(What)

在Python中,断言(assertion)是一种用于检查程序中的条件是否为真的工具。它用于在程序的特定点处验证一些假设,并在条件为假时触发异常如果断言为真,则程序继续执行;如果断言为假,则引发AssertionError异常。

assert语句的语法如下:

assert condition, message

其中,condition是一个布尔表达式,如果为真则断言通过;如果为假,则引发异常。"error message"是可选的错误消息字符串,当断言失败时用于解释为什么断言失败。

在Python源码中,assert语句的实现主要涉及以下几个步骤:

  1. 编译阶段:当Python解释器遇到assert语句时,它会将其编译成字节码。在字节码中,assert语句通常会被编码为一个特殊的操作码,例如POP_JUMP_IF_FALSE或POP_JUMP_IF_TRUE。
  2. 运行时检查:在执行字节码时,解释器会检查断言的条件表达式。如果条件为真,则继续执行后续的字节码;如果条件为假,则跳转到相应的异常处理代码。
  3. 引发异常:如果断言失败(即条件为假),解释器将跳转到预定义的异常处理代码。在那里,将使用给定的错误消息(如果有)构建一个AssertionError异常对象,并将其抛出。
  4. 异常处理:如果程序中没有捕获该异常,解释器将终止程序执行并打印错误消息。否则,异常将被传递给上层调用者或处理程序。

二、实践(How)

关于assert的关键字的使用,可以参照以下示例:

"""
Python中断言的使用与单元测试
"""
assert 1 < 0

该代码输出的结果为:

Traceback (most recent call last):
  File "/Users/PycharmProjects/python/coding/code.py", line 4, in <module>
    assert 1 < 0
AssertionError

据上可知,当assert后的布尔表达式结果为假后,抛出AssertionError异常,该异常可以被try…except捕获;

显示自定义错误消息,只需在assert语句中的表达式后面放置一个字符串;

"""
Python中断言的使用与单元测试
"""
assert 1 < 0, 'oh, im error~'

输出如下:

Traceback (most recent call last):
  File "/Users/PycharmProjects/python/coding/code.py", line 4, in <module>
    assert 1 < 0, 'oh, im error~'
AssertionError: oh, im error~

三、思考(Why)

既然断言如此有用,那为什么没有在大部分代码中看见它的使用呢?

断言软件开发中没有被大量使用的原因主要有以下几点

  • 运行时开销:使用断言需要对程序进行大量的检查,这可能会增加程序的运行时开销。对于一些性能敏感的场景,开发人员可能更倾向于避免使用断言。
  • 破坏程序流程:断言失败会导致程序抛出异常并停止执行。在某些情况下,这可能会中断程序的正常流程,导致一些难以预料的问题。
  • 测试和调试:虽然断言在调试和测试阶段非常有用,但在开发和测试阶段过去之后,许多开发人员可能就不再需要它们了。他们可能会更倾向于使用单元测试和集成测试来确保代码的正确性。
  • 不够直观:断言主要用于调试和测试,它们不能直接反映程序的主要逻辑。因此,在主代码库中大量使用断言可能会让代码看起来不够直观和整洁。
  • 文化和习惯:不同的开发团队可能有不同的编程风格和习惯。有些团队可能更倾向于使用断言进行错误检查,而其他团队可能更喜欢使用其他错误处理方法。
  • 静态类型语言不常用:断言在一些动态类型语言(如Python)中更为常见,而在静态类型语言(如Java、C++)中可能使用较少。这是因为静态类型语言通常具有更强大的类型系统和编译器,可以提供更多的错误检查和警告。
  • 缺少工具支持:虽然断言在一些集成开发环境(IDE)和构建工具中得到了支持,但并不是所有的工具都提供了对断言的完全支持。这可能导致一些开发人员认为断言不重要或不方便使用。

那我们在哪些场景下使用断言呢?

  • 测试和调试:assert语句通常用于测试和调试阶段,用于验证程序的某些假设是否成立。如果假设不成立,assert语句会抛出一个异常并停止程序的执行,从而帮助开发人员快速定位和修复问题。
  • 错误处理:在某些情况下,开发人员可以使用assert语句来处理程序中的错误情况。例如,如果程序中的某个条件不满足,则可以通过assert语句抛出一个异常来终止程序的执行。
  • 条件检查:assert语句可以用于在程序运行过程中检查某些条件是否满足。如果条件不满足,则程序将抛出一个异常并停止执行。这样可以确保程序的正确性。
  • 数据验证:在处理输入数据时,可以使用assert语句来验证数据是否符合预期的格式或条件。如果数据不符合要求,则可以抛出异常并终止程序的执行。
  • 代码优化:在某些情况下,开发人员可以使用assert语句来帮助优化代码的性能。例如,如果开发人员知道某个条件在大多数情况下都不成立,则可以使用assert语句来检查该条件。如果该条件成立,则程序将抛出一个异常并停止执行,从而避免执行不必要的代码。

特别注意!!!

assert语句主要用于开发和测试阶段,而不是用于生产环境。在生产环境中使用assert语句可能会导致程序意外终止,因此通常建议在发布之前禁用assert语句文章来源地址https://www.toymoban.com/news/detail-783967.html

到了这里,关于[Python] 断言assert与单元测试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python断言(assert)

    Python实用教程_spiritx的博客-CSDN博客 Python assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常。 断言可以在条件不满足程序运行的情况下直接返回错误,而不必等待程序运行后出现崩溃的情况,例如我们的代码只能在 Linux 系统下运行,可以先判断当前系

    2024年02月09日
    浏览(27)
  • Python-assert(断言)的用法

    时机 防御性的编程 运行时对程序逻辑的检测 合约性检查(比如前置条件,后置条件) 程序中的常量 检查文档 目的 与其让程序在晚些时候崩溃,不如在错误条件出现时,就直接让程序崩溃,这有利于我们对程序排错,提高程序的健壮性。assert 语句通常用于检查用户的输入

    2024年03月22日
    浏览(32)
  • JUnit 5单元测试(二)—— 断言

    上一篇讲了 JUnit 5单元测试(一)—— 基本配置,书接上文开始 JUnit 5单元测试(二)—— 断言 1.单元测试的类名应该起为 xxxxTest.java 表明这个一个测试类,类名应该用简洁的英文表明测试内容或函数。 例如:为了测试一个计算和的方法,可以取名为 SumTest.java 2.测试方法上

    2024年01月16日
    浏览(46)
  • java单元测试( Hamcrest 断言)

    单元测试特征: 1 范围狭窄 2 限于单一类或方法 3 体积小 为什么要编写单元测试? 为了防止错误(很明显!) 而且还可以提高开发人员的生产力,因为单元测试: (1) 帮助实施——在编码的同时编写测试可以快速反馈正在编写的代码。 (2) 失败时应该易于理解——每个测试在

    2024年02月06日
    浏览(29)
  • 精进单元测试技能 —— Pytest断言的艺术!

    本篇文章主要是阐述Pytest在断言方面的应用。让大家能够了解和掌握Pytest针对断言设计了多种功能以适应在不同测试场景上使用。 了解断言的基础 在Pytest中,断言是通过  assert  语句来实现的。简单的断言通常用于验证预期值和实际值是否相等,例如: 然而除此之外,Pyt

    2024年02月03日
    浏览(29)
  • 精进单元测试技能——Pytest断言的艺术

    本篇文章主要是阐述Pytest在断言方面的应用。让大家能够了解和掌握Pytest针对断言设计了多种功能以适应在不同测试场景上使用。 了解断言的基础 在Pytest中,断言是通过  assert  语句来实现的。简单的断言通常用于验证预期值和实际值是否相等,例如: 然而除此之外,Pyt

    2024年01月20日
    浏览(71)
  • 白盒测试(单元测试使用assertThat中equalTo断言)

    题目1 :根据下列流程图编写程序实现相应分析处理并显示结果。返回结果“a=x:”(x为2、3或4);其中变量x、y均须为整型。编写程序代码,使用JUnit框架编写测试类对编写的程序代码进行测试,测试类中设计最少的测试数据满足语句覆盖测试,每条测试数据需要在测试类中

    2024年02月13日
    浏览(26)
  • 【单元测试】Junit 4(三)--Junit4断言

    ​ **断言(assertion)**是一种在程序中的一阶逻辑(如:一个结果为真或假的逻辑判断式),目的为了表示与验证软件开发者预期的结果——当程序执行到断言的位置时,对应的断言应该为真。若断言不为真时,程序会中止执行,并给出错误信息。 这里我们直接上例子 接下来我们

    2024年02月08日
    浏览(42)
  • C++中的断言机制与gtest单元测试

       这部分内容网上已经有很多人讲了,我就不做重复性工作,制造垃圾了,大家看看下面两个链接就可以了,因为我的专栏除了分享自己学习的知识,主要想为大家提供完整学习路线,让大家的知识体系更加完善! (1)参考:https://www.cnblogs.com/lvchaoshun/p/7816288.html (1)参考:

    2023年04月08日
    浏览(87)
  • 白盒测试(单元测试JUnit使用断言assertThat中startsWith、endsWith方法)

    目录 一、背景知识 二、assertThat-字符串相关匹配符 1、startsWith 2、endsWith 三、代码

    2024年02月07日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包