python - 在 Python 中模拟远程主机

标签 python unit-testing mocking paramiko remote-server

我正在使用 paramiko 编写一些函数来执行命令并在远程主机上创建文件。我想为他们写一些单元测试,但我不知道实现这个目标的最简单方法是什么?这是我设想的代码示例大纲:

import os
import paramiko
import pytest

def my_function(hostname, relpath='.', **kwargs):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(hostname, **kwargs)
    sftp = ssh.open_sftp()
    sftp.chdir(relpath)
    stdin, stdout, stderr = ssh.exec_command("echo hallo > test.txt")

@pytest.fixture("module")
def mock_remote_host():
    # start a remote host here with a local test path
    try:
        yield hostname, testpath, {"username":"bob", "password":"1234"}
    finally:
        # delete the test path
        # close the remote host

def test_my_function(mock_remote_host):
    hostname, dirpath, kwargs = mock_remote_host
    my_function(hostname, **kwargs)
    filepath = os.path.join(dirpath, 'test.txt')
    assert os.path.exists(filepath)

我看过paramiko test modules ,但它们对于我的用例来说似乎相当复杂,我不确定如何简化它们。

最佳答案

我认为您真正需要模拟的是 paramiko.SSHClient 对象。您正在对函数 my_function 进行单元测试,您可以假设 paramiko 模块正常工作,并且您唯一需要进行单元测试的是 my_function 是否调用了这个 paramiko.SSHClient 以正确的方式。

要模拟 paramiko.SSH 模块,您可以使用 unittest.mock并用 @mock.patch.object(paramiko.SSHClient, sshclientmock) 装饰你的 test_my_function 函数。您必须先将 sshclientmock 定义为某种 MockMagicMock

在 python 2.7 中也有一些等效于 unittest.mock 但我不记得在哪里可以找到它。

编辑:正如@chepner 在评论中提到的那样。对于 python 2.7,您可以在 pypi 中找到 mock 模块。并使用 pip install mock

安装它

关于python - 在 Python 中模拟远程主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45917649/

相关文章:

python - 如何在 Visual Studio pyproj 项目中设置自定义构建步骤

unit-testing - 使用新的测试库在dart中设置单元测试的最佳方法是什么?

Python mock() 不模拟返回值

javascript - 如何模拟 axios.all 请求?

python - While循环中断问题(Python)

python - 如何从 Pandas 数据框中检索在其中一列末尾包含特定值的记录序列?

python - 迭代两个字典并创建一个键不匹配的新字典

java - Mockito Spy - 部分模拟不起作用?

reactjs - 我如何测试 url 搜索与 react 测试库的变化?

python - MagicMock 对象可以迭代吗?