Python assert断言机制与常用测试函数详解
本文详解Python中assert断言语句的语法、执行流程及在程序调试中的应用场景,重点介绍unittest模块中assertEqual、assertTrue等常用断言函数的使用方法与适用时机,帮助开发者提升代码健壮性与测试效率。
Python assert断言基础与执行流程
Python中的assert语句,即断言语句,可视为功能简化的if语句。它用于验证表达式的值:若表达式为真,程序继续执行;若为假,Python解释器将抛出AssertionError异常。
assert语句的基本语法结构如下:
assert 表达式
assert语句的执行逻辑等效于以下if判断结构:
if 表达式==True: 程序继续执行 else: 程序报 AssertionError 错误
读者或许会疑惑:既然assert会导致程序崩溃,为何还要使用它?原因在于,与其让错误在后续代码中隐蔽地引发更严重的后果,不如在错误条件出现时立即终止程序。这种“快速失败”机制有助于开发者迅速定位问题,从而提升程序的健壮性。因此,assert常用于验证用户输入是否符合规范,以及在程序开发初期的测试与调试阶段作为辅助工具。以下代码演示了assert的具体用法:
mathmark = int(input()) #断言数学考试分数是否位于正常范围内 assert 0 <= mathmark <= 100 #只有当 mathmark 位于 [0,100]范围内,程序才会继续执行 print("数学考试分数为:",mathmark)
运行上述程序,输入测试数据如下:
90
数学考试分数为: 90
再次运行该程序,输入测试数据为:
159
Traceback (most recent call last): File "C:\Users\mengma\Desktop\file.py", line 3, in <module> assert 0 <= mathmark <= 100 AssertionError
从运行结果可见,当assert后的表达式值为真时,程序正常继续执行;若值为假,程序将立即停止并抛出AssertionError错误。
常用断言函数详解
常用断言函数 常用
以下介绍几个常用的断言函数,它们能帮助开发者更精准地判断预期结果:-
- assertEqual
- assertNotEqual
- assertTrue
- assertFalse
- assertIsNone
- assertIsNotNone
- assertEqual 和 assertNotEqual
- assertEqual:若两个值相等,则测试通过(pass)
- assertNotEqual:若两个值不相等,则测试通过(pass)
使用方法:
assertEqual(first,second,msg),其中first与second进行比较,若相等则通过;msg为可选参数,用于指定失败时打印的信息。assertNotEqual的使用逻辑相反即可。
- assertTrue和assertFalse
- assertTrue:若判断bool值为True,则测试通过(pass)
- assertFalse:若判断bool值为False,则测试通过(Pass)
使用方法:
- assertTrue(expr,msg),其中expr为输入的表达式,若表达式为真则通过;msg为可选参数。assertFalse的逻辑相反,即表达式为假时通过。
- assertIsNone和assertIsNotNone
- assertIsNone:若对象不存在(为None),则测试通过(pass)
- assertIsNotNone:若对象存在,则测试通过(pass)
使用方法:
assertIsNone(obj,msg),用于检查某个元素是否为None。
总结:
常用
assertEqual(a, b) a == b assertNotEqual(a, b) a != b assertTrue(x) bool(x) is True assertFalse(x) bool(x) is False assertIs(a, b) a is b 2.7 assertIsNot(a, b) a is not b 2.7 assertIsNone(x) x is None 2.7 assertIsNotNone(x) x is not None 2.7 assertIn(a, b) a in b 2.7 assertNotIn(a, b) a not in b 2.7 assertIsInstance(a, b) isinstance(a, b) 2.7 assertNotIsInstance(a, b) not isinstance(a, b) 2.7
其它
assertAlmostEqual(a, b) round(a-b, 7) == 0 assertNotAlmostEqual(a, b) round(a-b, 7) != 0 assertGreater(a, b) a > b 2.7 assertGreaterEqual(a, b) a >= b 2.7 assertLess(a, b) a < b 2.7 assertLessEqual(a, b) a <= b 2.7 assertRegexpMatches(s, re) regex.search(s) 2.7 assertNotRegexpMatches(s, re) not regex.search(s) 2.7 assertItemsEqual(a, b) sorted(a) == sorted(b) and works with unhashable objs 2.7 assertDictContainsSubset(a, b) all the key/value pairs in a exist in b 2.7 assertMultiLineEqual(a, b) strings 2.7 assertSequenceEqual(a, b) sequences 2.7 assertListEqual(a, b) lists 2.7 assertTupleEqual(a, b) tuples 2.7 assertSetEqual(a, b) sets or frozensets 2.7 assertDictEqual(a, b) dicts 2.7 assertMultiLineEqual(a, b) strings 2.7 assertSequenceEqual(a, b) sequences 2.7 assertListEqual(a, b) lists 2.7 assertTupleEqual(a, b) tuples 2.7 assertSetEqual(a, b) sets or frozensets 2.7assertDictEqual(a, b) dicts 2.7
断言的使用时机与最佳实践
使用时机:
那么,在什么场景下应该使用断言呢?若无特殊目的,断言通常应用于以下情况:
- 防御性的编程
- 运行时对程序逻辑的检测
- 合约性检查(比如前置条件,后置条件)
- 程序中的常量
- 检查文档
- 例:防御性编程中添加断言
在代码开头添加注释是良好的习惯,但人们往往不愿阅读或更新这些注释,导致注释迅速过时。相比之下,断言既能对代码行为进行文档化说明,又能在断言被违反时直接引发简单且明确的失败,从而强制开发者关注潜在问题。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













