📜  python unittest mock - Python (1)

📅  最后修改于: 2023-12-03 14:46:05.590000             🧑  作者: Mango

Python unittest.mock模块

在Python的单元测试中,经常需要模拟一些依赖项或者外部系统的交互,这样我们才能在很多情况下进行自动化测试。Python的unittest.mock模块为我们提供了方便、灵活的测试模拟工具。

安装

unittest.mock是Python 3.3及以后版本的标准库,因此在最新的Python版本中应该已经装好了。如果你使用的Python版本较旧,则需要通过pip安装:

pip install mock
使用
例子

让我们看一个例子,假设我们有一个名为calculator的类,它的功能是在两个数字之间执行基本算术运算。 我们可以用unittest.mock来测试以下在该类中的函数:

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

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

这里是一个测试,它使用了unittest.mock来模拟add函数的行为:

from unittest.mock import MagicMock
import unittest

class TestCalculator(unittest.TestCase):
    def test_add(self):
        calculator = Calculator()
        calculator.add = MagicMock(return_value=10)
        result = calculator.add(2, 3)
        self.assertEqual(result, 10)

在这个测试中,我们使用MagicMock来模拟add方法的行为,并返回了一个固定的值10。然后我们测试了调用add方法后是否返回了这个我们预期的值。

Mock方法

MagicMock实际上是unittest.mock.Mock类的子类,它允许我们使用它的一些特殊方法进行模拟。

以下是Mock类的一些重要方法:

  • mock.call() 测试模拟对象是否已作为某个参数调用
  • mock.assert_called() 验证模拟对象是否已被调用
  • mock.assert_called_once() 验证模拟对象是否只被调用了一次
  • mock.assert_any_call() 验证模拟对象是否已作为某个参数调用于至少一次
  • mock.assert_not_called() 验证模拟对象是否未被调用

下面是一个例子:

def test_calculator_subtract(self):
    calculator = Calculator()
    calculator.subtract = MagicMock(return_value=5)
    result = calculator.subtract(2, 3)
    self.assertEqual(result, 5)
    calculator.subtract.assert_called_once()

在这个测试中,我们模拟了subtract方法,并测试了它是否成功被调用了一次。

用法

在测试中,我们可以使用python unittest.mock模块来模拟对象、方法、属性、上下文等的行为。 这使我们可以跳过测试中不必要的I / O或耗时操作,并且可以对我们在测试中处理的灰色区域进行细粒度的控制,例如并发或错误处理。

总的来说,unittest.mock模块可以大大简化测试中对依赖关系的管理,提高了我们测试的效率和简便性。

结论

unittest.mock模块提供的工具可以帮助我们模拟一些外部系统的交互或者模拟某些功能,以方便我们在测试开发中提高效率。如果你在测试开发中遇到了这类问题,那么unittest.mock就是你的好选择。