杰瑞科技汇

Python中assertequals的正确用法是什么?

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

Python中assertequals的正确用法是什么?-图1
(图片来源网络,侵删)

在 Python 的标准测试框架 unittest 中,功能完全相同的方法是 assertEqual()

下面我将详细解释 Python 中如何进行“断言相等”的检查,包括标准库方法和其他流行测试库的用法。


使用 unittest 框架 (标准库)

unittest 是 Python 自带的单元测试框架,它的断言方法名通常遵循 assert + 条件 的命名方式。

assertEqual(first, second, msg=None)

这是 unittest 中最核心的断言方法之一。

Python中assertequals的正确用法是什么?-图2
(图片来源网络,侵删)
  • 功能:判断 first 是否等于 second
  • 相等性判断:它使用的是 运算符,因此它会比较两个对象的是否相等,而不是它们的身份(内存地址)。
  • 失败时first 不等于 second,测试会失败,并抛出 AssertionErrormsg 参数可以提供自定义的错误信息。

示例代码

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:

    Python中assertequals的正确用法是什么?-图3
    (图片来源网络,侵删)
    • 优点:语法简洁,在任何地方都可以使用。
    • 缺点:失败时输出的错误信息可能不够详细,尤其是在处理复杂对象时,可能只会显示 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,它更现代、更简洁,并且提供了无与伦比的错误报告,能极大地提升你的测试效率。
分享:
扫描分享到社交APP
上一篇
下一篇