杰瑞科技汇

Python unittest如何安装?

好消息是,您几乎不需要单独安装 unittest

Python unittest如何安装?-图1
(图片来源网络,侵删)

unittest 是 Python 的标准库之一,意思是只要您的 Python 环境是正常安装的,它就已经包含在内了,您可以直接使用它,无需通过 pip 等包管理器进行额外安装。


验证 unittest 是否已安装

您可以通过以下两种方式来确认 unittest 是否可用:

使用 Python 解释器

在您的终端或命令行中,输入 pythonpython3 进入交互式解释器,然后尝试导入 unittest 模块,如果没有报错,就说明它已经安装好了。

# 打开您的终端或命令行工具
python3
>>> import unittest
>>> # 如果没有看到任何错误信息,就说明安装成功!
>>> # 您还可以查看它的版本信息
>>> print(unittest.__version__)
# 通常标准库模块没有 __version__ 属性,但这证明了模块可以正常导入
>>> exit() # 退出解释器

使用命令行运行测试

unittest 模块带有一个命令行测试运行器,您可以尝试运行一个不存在的测试文件,如果它提示 "Module not found",也证明了 unittest 工具本身是可用的。

Python unittest如何安装?-图2
(图片来源网络,侵删)
# 尝试运行一个不存在的测试文件
python3 -m unittest nonexistent_test.py

您应该会看到类似下面的输出,这表明 unittest 模块本身是工作的,只是找不到指定的测试文件。

E
======================================================================
ERROR: nonexistent_test (unittest.loader._FailedTest)
----------------------------------------------------------------------
ImportError: Failed to import test module: nonexistent_test
Traceback (most recent call last):
  File "/path/to/your/python/lib/python3.10/unittest/loader.py", line 470, in _find_test_path
    module = self._top_level_dir(path)
ModuleNotFoundError: No module named 'nonexistent_test'
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (errors=1)

unittest 的核心概念和使用方法

既然 unittest 已经可用,我们来看看如何使用它来编写和运行测试。unittest 框架基于四个核心概念:

  1. 测试用例: 一个最小的测试单元,它检查一个特定的输入是否能产生预期的输出,在 unittest 中,这通常是一个继承自 unittest.TestCase 的类。
  2. 测试套件: 多个测试用例的集合,用于一起运行。
  3. 测试运行器: 负责执行测试套件,并输出测试结果。
  4. 断言: 用于验证测试结果是否与预期相符的方法(assertEqual, assertTrue),如果断言失败,测试就会失败。

一个完整的示例

假设我们有一个简单的 calculator.py 文件,我们想为它编写测试。

准备被测试的代码 (calculator.py)

# calculator.py
class Calculator:
    def add(self, a, b):
        return a + b
    def subtract(self, a, b):
        return a - b
    def multiply(self, a, b):
        return a * b
    def divide(self, a, b):
        if b == 0:
            raise ValueError("Cannot divide by zero")
        return a / b

编写测试代码 (test_calculator.py)

测试文件通常命名为 test_*.py*_test.py

# test_calculator.py
import unittest
from calculator import Calculator # 导入我们要测试的模块
class TestCalculator(unittest.TestCase):
    # 在每个测试方法运行前执行,用于设置测试环境
    def setUp(self):
        self.calc = Calculator()
    # 在每个测试方法运行后执行,用于清理测试环境
    def tearDown(self):
        # 在这个简单例子中不需要清理,但在复杂场景下很有用
        pass
    # 测试加法方法
    def test_add(self):
        self.assertEqual(self.calc.add(1, 2), 3)
        self.assertEqual(self.calc.add(-1, 5), 4)
        self.assertEqual(self.calc.add(0, 0), 0)
    # 测试减法方法
    def test_subtract(self):
        self.assertEqual(self.calc.subtract(5, 3), 2)
        self.assertEqual(self.calc.subtract(2, 5), -3)
    # 测试乘法方法
    def test_multiply(self):
        self.assertEqual(self.calc.multiply(3, 4), 12)
        self.assertEqual(self.calc.multiply(-2, 5), -10)
    # 测试除法方法 - 测试正常情况
    def test_divide(self):
        self.assertEqual(self.calc.divide(10, 2), 5)
        self.assertEqual(self.calc.divide(7, 2), 3.5)
    # 测试除法方法 - 测试异常情况
    def test_divide_by_zero(self):
        # 使用 assertRaises 来验证是否会抛出预期的异常
        with self.assertRaises(ValueError):
            self.calc.divide(10, 0)
# 如果直接运行此脚本,则执行测试
if __name__ == '__main__':
    unittest.main()

运行测试

您有多种方式来运行这些测试。

直接运行测试文件

在终端中,导航到 test_calculator.py 所在的目录,然后直接运行该文件。

python3 test_calculator.py

输出结果:

.....
----------------------------------------------------------------------
Ran 5 tests in 0.001s
OK

这里的每个点 代表一个通过的测试。

使用 unittest 模块的命令行运行器(推荐)

这种方式更强大,可以发现目录下所有符合命名规则的测试文件。

在终端中,导航到 test_calculator.py 所在的目录,然后执行:

# -m unittest 表示将 unittest 模块作为脚本运行
python3 -m unittest

或者更明确地指定测试文件或目录:

# 运行特定文件中的所有测试
python3 -m unittest test_calculator.py
# 运行特定文件中的特定测试类
python3 -m unittest test_calculator.TestCalculator
# 运行特定文件中的特定测试方法
python3 -m unittest test_calculator.TestCalculator.test_add

如果测试失败,输出会非常详细,告诉您哪个测试失败了,以及期望值和实际值是什么。


常见问题与最佳实践

Q: 我的 Python 版本很旧,unittest 不好用怎么办?

A: 如果您使用的是非常古老的 Python 版本(Python 2.7 之前),unittest 的功能可能比较有限,但在现代 Python (3.x) 中,它已经非常完善。强烈建议您升级到最新的 Python 3.x 版本

Q: unittest 和其他测试框架(如 pytest)有什么区别?

A: unittest 是标准库,开箱即用,语法稍显冗长(需要继承 TestCase,方法名以 test_ 开头)。pytest 是第三方库,语法更简洁、灵活,功能更强大(fixtures、丰富的插件生态)。

  • unittest: 适合小型项目、学习测试基础,或者作为公司/项目的标准。
  • pytest: 适合中大型项目,追求更高效的开发体验和更强大的功能,很多开发者最终都会选择 pytest

如果您想尝试 pytest,安装和使用也很简单:

# 安装 pytest
pip install pytest
# 将上面的 test_calculator.py 文件重命名为 test_calculator_pytest.py (文件名以 test_ 开头即可)
# 运行测试 (pytest 会自动发现并运行所有测试)
pytest

最佳实践

  1. 命名规范: 测试文件名以 test_ 开头(如 test_example.py)或以 _test.pyexample_test.py),测试类名以 Test 开头(如 TestMyClass),测试方法名以 test_ 开头(如 test_something)。
  2. 一个测试只测一件事: 确保每个测试方法只验证一个功能点。
  3. 使用 setUptearDown: 当多个测试需要共享相同的准备和清理代码时,使用它们来避免代码重复。
  4. 优先使用 assertEqual 等断言方法: 它们比 Python 内置的 assert 语句能提供更清晰的错误信息。
  5. 测试覆盖率: 使用工具(如 coverage.py)来衡量您的代码有多少比例被测试覆盖,帮助您发现未测试的代码。
  • 安装: unittest 是 Python 标准库,无需安装。
  • 使用: 编写继承自 unittest.TestCase 的类,在类中以 test_ 开头的方法定义测试,使用 self.assertEqual() 等断言方法。
  • 运行: 使用 python3 -m unittest 命令来发现并运行测试。
  • 进阶: 如果觉得 unittest 语法繁琐,可以学习并使用更现代的第三方测试框架 pytest
分享:
扫描分享到社交APP
上一篇
下一篇