说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
单元测试是确保代码正确性的一个重要手段。在 Python 中,有几个常用的单元测试库,包括 unittest(Python 内置模块)、pytest 和 nose 等。下面将更加系统地介绍 Python 的单元测试,包括单元测试的基本概念、测试框架 unittest 的详细用法、编写和运行单元测试的方法以及一些高级特性。
需要先了解以下的基本概念:
unittest 是 Python 标准库中用于编写和运行单元测试的模块。它提供了丰富的功能,可以方便地创建、组织和执行测试。
定义测试类和测试方法:
import unittest
# 被测试的函数
def add(a, b):
return a + b
# 创建测试类
class TestAddFunction(unittest.TestCase):
# 定义测试方法
def test_add_integers(self):
self.assertEqual(add(1, 2), 3)
self.assertEqual(add(-1, 1), 0)
self.assertEqual(add(-1, -1), -2)
def test_add_floats(self):
self.assertAlmostEqual(add(1.1, 2.2), 3.3, places=1)
self.assertAlmostEqual(add(-1.1, 1.1), 0.0, places=1)
self.assertAlmostEqual(add(-1.1, -1.1), -2.2, places=1)
# 运行测试
if __name__ == '__main__':
unittest.main()
常用断言方法:
使用 setUp 和 tearDown:在每个测试方法运行前后执行一些初始化和清理工作。
class TestAddFunction(unittest.TestCase):
def setUp(self):
# 每个测试方法前执行
self.a = 1
self.b = 2
def tearDown(self):
# 每个测试方法后执行
pass
def test_add_integers(self):
result = add(self.a, self.b)
self.assertEqual(result, 3)
使用 setUpClass 和 tearDownClass:在整个测试类开始和结束时执行一次的初始化和清理工作。
class TestAddFunction(unittest.TestCase):
@classmethod
def setUpClass(cls):
# 测试类开始前执行一次
cls.a = 1
cls.b = 2
@classmethod
def tearDownClass(cls):
# 测试类结束后执行一次
pass
def test_add_integers(self):
result = add(self.a, self.b)
self.assertEqual(result, 3)
可以通过多种方式运行测试:
直接运行测试脚本,将测试代码保存为 test_add.py 文件,然后在终端中运行:
python test_add.py
使用 unittest 命令行:
python -m unittest test_add.py
自动发现测试:在包含多个测试文件的目录中,可以使用 unittest 自动发现并运行所有测试:
python -m unittest discover
跳过测试:可以使用装饰器跳过某些测试:
class TestAddFunction(unittest.TestCase):
@unittest.skip("暂时跳过测试")
def test_add_integers(self):
self.assertEqual(add(1, 2), 3)
@unittest.skipIf(True, "条件为真时跳过测试")
def test_add_floats(self):
self.assertAlmostEqual(add(1.1, 2.2), 3.3, places=1)
期望异常:测试代码是否正确地引发了预期的异常:
def divide(a, b):
if b == 0:
raise ValueError("除数不能为零")
return a / b
class TestDivideFunction(unittest.TestCase):
def test_divide_by_zero(self):
with self.assertRaises(ValueError):
divide(1, 0)
使用 mock 对象:unittest.mock 模块可以创建和使用模拟对象,用于替代和模拟真实对象,以便更灵活地测试代码。
from unittest.mock import Mock
# 创建 Mock 对象
mock = Mock()
# 配置 Mock 对象的行为
mock.return_value = 10
# 使用 Mock 对象
result = mock(1, 2, 3)
# 断言
assert result == 10
mock.assert_called_with(1, 2, 3)
单元测试是确保代码质量的重要手段,通过系统地编写和运行单元测试,可以有效地发现和修复代码中的问题。Python 的 unittest 模块提供了丰富的功能,能够帮助我们方便地创建、组织和运行测试。希望上述内容能帮助你更好地理解和使用 Python 的单元测试。
在 Python 社区中,有几个第三方测试库因其功能强大、易于使用而被广泛采用。
pytest 是目前最流行的 Python 测试框架之一。它不仅支持简单的单元测试,还支持复杂的功能测试。pytest 提供了许多有用的功能,如自动发现测试、参数化测试、灵活的断言、以及丰富的插件系统。
特点:
虽然不是严格意义上的测试库,但tox常用于测试自动化:
更新时间:2024-07-03 14:39:47 标签:python 单元测试 测试