0


[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中断言的使用与单元测试
"""assert1<0

该代码输出的结果为:

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

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

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

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

输出如下:

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

三、思考(Why)

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

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

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

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

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

特别注意!!!

assert语句主要用于开发和测试阶段,而不是用于生产环境。在生产环境中使用assert语句可能会导致程序意外终止,因此通常建议在发布之前禁用assert语句

标签: python 单元测试

本文转载自: https://blog.csdn.net/wy1764045114/article/details/135459692
版权归原作者 然然然也 所有, 如有侵权,请联系我们删除。

“[Python] 断言assert与单元测试”的评论:

还没有评论