在 Python 中,并没有名为 assertEquals 的内置函数或关键字,这个名称通常出现在其他编程语言(如 Java、JavaScript 的 JUnit/Jest 测试框架)中。

在 Python 的标准测试框架 unittest 中,功能完全相同的方法是 assertEqual()。
下面我将详细解释 Python 中如何进行“断言相等”的检查,包括标准库方法和其他流行测试库的用法。
使用 unittest 框架 (标准库)
unittest 是 Python 自带的单元测试框架,它的断言方法名通常遵循 assert + 条件 的命名方式。
assertEqual(first, second, msg=None)
这是 unittest 中最核心的断言方法之一。

- 功能:判断
first是否等于second。 - 相等性判断:它使用的是 运算符,因此它会比较两个对象的值是否相等,而不是它们的身份(内存地址)。
- 失败时:
first不等于second,测试会失败,并抛出AssertionError。msg参数可以提供自定义的错误信息。
示例代码
import unittest
class TestStringMethods(unittest.TestCase):
def test_assert_equal_integers(self):
# 两个整数相等
self.assertEqual(10 + 2, 12)
print("整数断言通过")
def test_assert_equal_strings(self):
# 两个字符串相等
self.assertEqual("hello", "hello")
print("字符串断言通过")
def test_assert_equal_lists(self):
# 两个列表内容相等
list1 = [1, 2, 3]
list2 = [1, 2, 3]
self.assertEqual(list1, list2)
print("列表断言通过")
def test_assert_equal_failure(self):
# 这个断言会失败
# self.assertEqual(10, 20) # 取消注释此行以查看失败情况
print("这个测试将被跳过,因为断言会失败")
def test_assert_not_equal(self):
# 测试不相等的情况
self.assertNotEqual(10, 20)
print("断言不相等通过")
if __name__ == '__main__':
unittest.main()
运行结果:
整数断言通过
字符串断言通过
列表断言通过
断言不相等通过
.
----------------------------------------------------------------------
Ran 4 tests in 0.001s
OK
assertEqual vs assert ==
初学者可能会疑惑,为什么不直接用 assert a == b?
-
self.assertEqual(a, b):- 优点:失败时输出的错误信息更友好,它会清晰地告诉你期望的值是什么,实际得到的值是什么。
AssertionError: 10 != 20 - 缺点:需要继承
unittest.TestCase。
- 优点:失败时输出的错误信息更友好,它会清晰地告诉你期望的值是什么,实际得到的值是什么。
-
assert a == b:
(图片来源网络,侵删)- 优点:语法简洁,在任何地方都可以使用。
- 缺点:失败时输出的错误信息可能不够详细,尤其是在处理复杂对象时,可能只会显示
False。Traceback (most recent call last): File "<stdin>", line 1, in <module> AssertionError
最佳实践:在编写单元测试时,强烈推荐使用 unittest.TestCase 提供的断言方法(如 assertEqual, assertTrue, assertIn 等),因为它们能提供更清晰的错误报告,帮助你更快地定位问题。
使用 pytest 框架 (第三方库)
pytest 是一个比 unittest 更简洁、更灵活的测试框架,是目前非常流行的选择。
在 pytest 中,你不需要继承任何类,也不需要使用 self.assertEqual 这样的方法,你只需要使用 Python 内置的 assert 语句和 运算符即可。
示例代码
# test_pytest_example.py
def test_integers():
assert 10 + 2 == 12
def test_strings():
assert "hello" == "hello"
def test_lists():
list1 = [1, 2, 3]
list2 = [1, 2, 3]
assert list1 == list2
def test_failure_example():
# 这个测试会失败
assert 10 == 20
运行 pytest:
pytest
失败时的输出:
pytest 的失败报告非常出色,它会自动高亮显示差异,让你一目了然。
========================= test session starts =========================
...
collected 4 items
test_pytest_example.py F..F [100%]
================================== FAILURES ===================================
________________________________ test_failure_example ________________________
def test_failure_example():
> assert 10 == 20
E assert 10 == 20
E -10
E +20
test_pytest_example.py:11: AssertionError
======================== 2 failed, 2 passed in ...s =========================
总结与对比
| 特性 | unittest.assertEqual |
assert a == b (with pytest) |
|---|---|---|
| 所属框架 | Python 标准库 (unittest) |
第三方库 (pytest) |
| 语法 | self.assertEqual(a, b) |
assert a == b |
| 使用方式 | 必须继承 unittest.TestCase |
无需继承,函数名以 test_ 开头即可 |
| 错误报告 | 良好,显示期望值 vs 实际值 | 非常出色,自动高亮差异,信息丰富 |
| 扩展性 | 提供大量其他断言方法(assertTrue, assertIn 等) |
可以使用 pytest 的插件和丰富的断言表达(如 assert x in y) |
| 推荐场景 | 已有 unittest 项目,或不想引入第三方依赖 |
新项目推荐,代码更简洁,功能更强大 |
- 如果你在寻找 Python 的
assertEquals,那么它就是unittest框架中的assertEqual()方法。 - 对于新的 Python 项目,强烈推荐学习和使用
pytest,它更现代、更简洁,并且提供了无与伦比的错误报告,能极大地提升你的测试效率。
