在Python中基于输入的模拟返回值

本文将演示如何在Python中创建一个模拟函数,根据输入返回不同的值。我们还将向你展示如何测试我们的模拟函数。

最后,我们将向你展示一些更高级的模拟函数的技术。你不需要了解编程或测试,就可以跟着学习。

在Python中基于输入的模拟返回值

Python是一种非常强大的语言,拥有丰富的测试工具的生态系统。它有许多功能,使其成为单元测试的完美选择。

一个流行的工具是mock 模块,它允许我们用模拟对象替换我们系统的一部分,并断言它们是如何被使用的。

嘲讽函数允许我们用我们的代码替换一个函数的功能。当我们想测试我们的代码在某个函数不可用时的行为,或者我们想测试我们的代码对不同输入的反应时,这可能很有用。

Python中嘲讽的用途

嘲讽是一种强大的技术,可以用来提高我们测试的可靠性和效率。这篇文章将教我们如何在Python测试中使用模拟对象。

  1. 嘲讽允许我们用模拟的版本来替换真实的对象。当我们想测试一个依赖于另一个尚不可用的组件时,这可能很有用。

    例如,我们可能想测试一个数据库连接,而不需要实际连接到一个数据库。

  2. 嘲弄也可以用来存留外部的依赖关系。当我们想避免在测试过程中进行网络调用或与数据库交互时,这可能很有用。

  3. 嘲讽可以用来提高我们测试的效率。当我们模拟一个对象时,我们可以避免实例化真实对象的开销。

    这在测试许多对象实例化的代码时特别有用。

  4. 嘲弄也可以用来使我们的测试更加可靠。存根于外部的依赖性可以避免依赖网络或数据库可用性的不稳定测试。

在Python中使用模拟对象

要在我们的测试中使用模拟对象,我们首先需要创建一个Mock类。这个类可以用来创建模拟对象,其外观和行为与真实的东西一样。

一旦我们有了Mock类,我们就可以实例化模拟对象并在我们的测试中使用它们。模拟对象拥有与它们所替代的真实对象相同的方法,所以我们可以像使用真实对象一样使用它们。

当我们使用完一个模拟对象后,我们可以断言它被正确使用。例如,我们可以断言一个模拟的数据库连接被用来执行一个查询。

因此,嘲弄是一个强大的工具,可以用来提高我们Python测试的可靠性和效率。

通过用模拟对象代替真实对象,我们可以避免实例化真实对象的开销。我们还可以剔除外部依赖,使我们的测试更加可靠。

Python中嘲讽的含义

mocking 这个词在多个语境中使用;然而,以下定义将在本文中使用:

“用假的调用或对象代替一个或多个实际的函数调用或对象的过程。”

对模拟函数的调用提供了一个已经预设好的瞬时值,而没有实际工作。假对象的特征和方法以同样的方式完全在测试内部定义,而不需要首先生成实际对象或做任何其他工作。

当涉及到测试时,编写测试的人可以定义函数调用的返回值,这给了他们巨大的权力。然而,这也意味着编写测试的人需要做一些基础性的工作,以便准确地设置好一切。

Python中的unittest.mock 模块就是负责编程语言中的嘲弄。patch函数,作为装饰器和上下文管理器,以及MagicMock 类,是这个模块中两个重要的类和函数。

它还包括其他几个有用的类和方法。嘲弄 Python 的大部分工作都可以通过使用这两个强大的组件来完成。

编写一个根据输入返回不同值的模拟程序

现在我们已经很清楚地知道了mock和它的功能。让我们通过编码实例更好地理解mock。

为了创建函数,我们将使用*args**kwargs ,因为这些参数可以接受简单的和关键字的参数。所以,我们可以传递任何数据类型:字符串、整数、浮点数和布尔值,我们也可以给关键字参数赋值。

  • 创建一个函数。
  • 传递参数*args 和关键字参数**kwargs
  • 返回一个元组,其中有*args**kwargs
  • 调用该函数

请看下面的代码,以便更好地理解。

def mock_function(*args, **kwargs):
    return (args, kwargs)
mock_function('x', 'y')
(('x', 'y'), {})
mock_function('x', y=2, z='mock test')

输出:

(('x',), {'y': 2, 'z': 'mock test'})

在代码输出中,我们可以看到*args 的值被首先打印出来,也就是x**kwargs 的值{'y': 2, 'z': 'mock test'}) 被打印在它之后。

基于输入返回的Python模拟

现在我们将创建一个模拟函数,返回我们前面讨论的函数。

  • 为了创建一个模拟函数,我们将首先从unittest.mock 模块导入MagicMock
  • 创建一个变量并使用unittest.mock 中的MagicMock

示例代码:

from unittest.mock import MagicMock
my_mock_1 = MagicMock(name='abid', return_value=mock_function)
my_mock_1

输出:

<MagicMock name='abid' id='139916486559696'>

代码输出显示,使用了MagicMock 命令。我们可以看到我们在代码中使用的名称abid 和代码生成的ID号码。

现在我们将创建另一个变量,看看我们的变量my_mock_1 在哪里。

示例代码:

func_from_mock2 = my_mock_1()
func_from_mock2

输出:

<function __main__.mock_function(*args, **kwargs)>

代码输出显示,该函数带有参数*args 和关键字参数**kwargs

现在我们将给我们的变量func_from_mock2 一些值。所以我们将传递10, 10 ,并打印出来。

示例代码:

func_from_mock2(10,10)

输出:

((10, 10), {})

输出((10, 10)) 表示我们已经使用了参数*args {} 表示我们可以使用关键字参数**kwargs

现在我们将使用关键字参数**kwargs

示例代码:

func_from_mock2(15, 18, param=50)

输出:

((15, 18), {'param': 50})

我们同时使用了参数*args 和关键字参数**kwargs((15, 18), 显示了模拟输入的参数部分,{'param': 50}) 显示了模拟输入的关键字参数部分。

所以,这就是Mock 如何根据输入返回不同的值。

我们希望这篇Python文章对你了解如何在Python中使用Mock 有帮助。