Python测试: unitest

下面是一个简明而全面的 Python unittestunittest.mock 的使用教程,适合初学者和希望巩固基础的开发者。



🧪 一、unittest 基础使用

Python 内置的 unittest 模块是一个用于编写和运行单元测试的标准库。

1.1 编写一个简单测试

假设我们有一个被测试的函数:

# calculator.py

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

编写对应的测试文件:

# test_calculator.py
import unittest
from calculator import add

class TestCalculator(unittest.TestCase):
    def test_add(self):
        self.assertEqual(add(2, 3), 5)
        self.assertEqual(add(-1, 1), 0)
        self.assertNotEqual(add(2, 2), 5)

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

运行测试:

python test_calculator.py


🧰 二、常用断言方法

方法说明
assertEqual(a, b)断言 a == b
assertNotEqual(a, b)断言 a != b
assertTrue(x)断言 bool(x) is True
assertFalse(x)断言 bool(x) is False
assertIs(a, b)断言 a is b
assertIsNone(x)断言 x is None
assertIn(a, b)断言 a in b
assertRaises(Exception)断言某个异常被抛出

示例:

def div(a, b):
    return a / b

class TestMath(unittest.TestCase):
    def test_div_zero(self):
        with self.assertRaises(ZeroDivisionError):
            div(1, 0)


🧪 三、使用 unittest.mock 模拟依赖

unittest.mock 模块用于替换代码中某些部分,以便隔离测试。

3.1 mock 一个函数

# weather.py
import requests

def get_weather(city):
    response = requests.get(f"https://api.weather.com/{city}")
    return response.json()

测试时我们不希望真的请求 API:

# test_weather.py
import unittest
from unittest.mock import patch
from weather import get_weather

class TestWeather(unittest.TestCase):
    @patch('weather.requests.get')
    def test_get_weather(self, mock_get):
        mock_get.return_value.json.return_value = {'temp': 25}

        result = get_weather('beijing')
        self.assertEqual(result['temp'], 25)

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

3.2 mock 方法返回值

mock_obj.method.return_value = 123

3.3 mock.side_effect

用于模拟抛异常或多次返回不同值:

mock_obj.method.side_effect = ValueError("error")
mock_obj.method.side_effect = [1, 2, 3]


🧪 四、常用 Mock 工具

工具说明
patch临时替换对象
patch.object替换对象的属性
MagicMock()自动支持大部分魔法方法的 Mock 对象
Mock()基本的可配置模拟对象


🔁 五、组织测试代码的结构

my_project/
│
├── calculator.py
├── weather.py
├── tests/
│   ├── __init__.py
│   ├── test_calculator.py
│   └── test_weather.py

运行所有测试:

python -m unittest discover -s tests


✅ 小结

  • 用 unittest 进行结构化测试。
  • 用 unittest.mock 替换外部依赖(如 HTTP 请求、数据库等)。
  • 使用 patch() 是最常用的 mock 技术。
  • 测试结构清晰有助于维护和 CI/CD。


如果你希望我生成一个完整的可运行项目模板(zip 文件)或想学习 pytest(更现代的测试框架),也可以告诉我!

文章标签:

评论(0)