一文读懂 Python 中的 unittest 框架

文摘   2024-11-14 08:33   上海  

什么是 unittest?

unittest 是 Python 的内置测试框架,用于编写和运行测试用例。它提供了丰富的断言方法和组织测试用例的方式,使得编写单元测试变得更加简单和高效。

为什么使用 unittest?

1. 自动化测试:可以自动运行测试用例,节省时间和精力。2. 代码质量保证:通过测试确保代码的正确性和稳定性。3. 文档作用:测试用例可以作为代码的文档,帮助理解和维护代码。

安装和导入

unittest 是 Python 的标准库,无需安装,直接导入即可:

import unittest

基本概念

测试用例(TestCase)

测试用例是 unittest 中最基本的测试单位,通常是一个类,继承自 unittest.TestCase。每个测试方法以 test_ 开头。

断言(Assertions)

断言用于验证测试结果是否符合预期。unittest 提供了多种断言方法,如 assertEqualassertTrue 等。

测试套件(TestSuite)

测试套件用于组织多个测试用例,可以将多个测试用例组合在一起运行。

测试加载器(TestLoader)

测试加载器用于加载测试用例,可以自动发现并加载指定目录下的测试用例。

测试运行器(TestRunner)

测试运行器用于执行测试用例,并生成测试报告。

示例:基本测试用例

让我们从一个简单的例子开始,编写一个测试用例来验证一个函数的功能。

import unittest

def add(a, b):
    return a + b

class TestAddFunction(unittest.TestCase):
    def test_add_positive_numbers(self):
        self.assertEqual(add(12), 3)  # 验证 1 + 2 = 3

    def test_add_negative_numbers(self):
        self.assertEqual(add(-1-2), -3)  # 验证 -1 + -2 = -3

if __name__ == '__main__':
    unittest.main()

运行测试

保存上述代码为 test_add.py,然后在命令行中运行:

python test_add.py

输出结果:

..
----------------------------------------------------------------------
Ran 2 tests in 0.001s

OK

更多断言方法

unittest 提供了多种断言方法,常用的有:

  • assertEqual(a, b):验证 a == b
  • assertTrue(x):验证 x 为真
  • assertFalse(x):验证 x 为假
  • assertIn(a, b):验证 ab
  • assertNotIn(a, b):验证 a 不在 b
  • assertRaises(exception, callable, *args, **kwargs):验证调用 callable 时会抛出 exception 异常

示例:使用更多断言方法

import unittest

def divide(a, b):
    if b == 0:
        raise ValueError("Cannot divide by zero")
    return a / b

class TestDivideFunction(unittest.TestCase):
    def test_divide_positive_numbers(self):
        self.assertEqual(divide(102), 5)  # 验证 10 / 2 = 5

    def test_divide_negative_numbers(self):
        self.assertEqual(divide(-10-2), 5)  # 验证 -10 / -2 = 5

    def test_divide_by_zero(self):
        with self.assertRaises(ValueError):  # 验证除以零会抛出 ValueError
            divide(100)

if __name__ == '__main__':
    unittest.main()

测试套件和测试加载器

我们可以使用 TestSuiteTestLoader 来组织和加载多个测试用例。

import unittest

class TestAddFunction(unittest.TestCase):
    def test_add_positive_numbers(self):
        self.assertEqual(add(12), 3)

    def test_add_negative_numbers(self):
        self.assertEqual(add(-1-2), -3)

class TestDivideFunction(unittest.TestCase):
    def test_divide_positive_numbers(self):
        self.assertEqual(divide(102), 5)

    def test_divide_negative_numbers(self):
        self.assertEqual(divide(-10-2), 5)

    def test_divide_by_zero(self):
        with self.assertRaises(ValueError):
            divide(100)

if __name__ == '__main__':
    suite = unittest.TestSuite()
    loader = unittest.TestLoader()

    suite.addTests(loader.loadTestsFromTestCase(TestAddFunction))
    suite.addTests(loader.loadTestsFromTestCase(TestDivideFunction))

    runner = unittest.TextTestRunner()
    runner.run(suite)

实战案例:测试一个简单的类

假设我们有一个 Calculator 类,包含加法和减法方法,我们需要为其编写测试用例。

import unittest

class Calculator:
    def add(self, a, b):
        return a + b

    def subtract(self, a, b):
        return a - b

class TestCalculator(unittest.TestCase):
    def setUp(self):
        self.calc = Calculator()  # 初始化 Calculator 对象

    def test_add(self):
        self.assertEqual(self.calc.add(12), 3)  # 验证 1 + 2 = 3

    def test_subtract(self):
        self.assertEqual(self.calc.subtract(105), 5)  # 验证 10 - 5 = 5

if __name__ == '__main__':
    unittest.main()

总结

本文介绍了 Python 中的 unittest 框架,包括其基本概念、常用断言方法、测试套件和测试加载器的使用。通过多个示例,逐步展示了如何编写和运行测试用例。最后,通过一个实战案例,进一步巩固了对 unittest 的理解和应用。

好了,今天的分享就到这里了,我们下期见。如果本文对你有帮助,请动动你可爱的小手指点赞、转发、在看吧!

付费合集推荐

Python编程基础

Python办公自动化-Excel

微信公众号批量上传发布系统

文末福利

公众号消息窗口回复“编程资料”,获取Python编程、人工智能、爬虫等100+本精品电子书。

精品系统

微信公众号批量上传发布系统

关注我👇,精彩不再错过


手把手PythonAI编程
分享与人工智能和python编程语言相关的笔记和项目经历。
 最新文章