Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python模拟远程主机_Python_Unit Testing_Mocking_Paramiko_Remote Server - Fatal编程技术网

用Python模拟远程主机

用Python模拟远程主机,python,unit-testing,mocking,paramiko,remote-server,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

我正在编写一些函数,使用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.SSHClient
对象。您正在单元测试您的函数
my_function
,您可以假设
paramiko
模块工作正常,您唯一需要进行单元测试的是
my_function
是否以正确的方式调用了该
paramiko.SSHClient
的方法

要模拟
paramiko.SSH
模块,您可以使用
@mock.patch.object(paramiko.SSHClient,sshclientmock)
来使用和修饰
test_my_函数
函数。您必须首先将
sshclientmock
定义为某种
Mock
MagicMock

在Python2.7中还有一些与unittest.mock相当的东西,但我不记得在哪里可以找到它


编辑:评论中提到@chepner。对于Python2.7,您可以在中找到
mock
模块,并使用
pip install mock

安装它。如果要测试远程连接、远程文件系统结构和远程路径导航,您必须设置一个模拟主机服务器(可能是VM)。换句话说,如果您想在主机上测试您的操作,您必须模拟主机


如果您想使用主机的数据测试您的操作,最简单的方法似乎是运行。t在另一个答案中说。

为了回答我自己的问题,我创建了:

如自述文件所述;它基于,并基于添加(以实现更多sftp功能)

还进行了以下更改:

  • 修改了
    users
    参数,以便可以使用私有路径密钥或密码
  • 服务器
    上下文管理器中添加了
    dirname
    参数,以便在上下文持续期间将其设置为根路径
  • 已修补
    paramiko.sftp_client.SFTPClient.chdir
    以修复其相对路径的使用

请参阅test_mockssh.py以了解其使用示例。

我同意HraBal,因为“基础架构即代码”。您可以将虚拟机视为一块代码

例如:

  • 您可以使用vagrant或docker初始化SSH服务器,然后修改DNS配置文件<代码>目标域127.0.0.1
  • 将应用程序放入服务器。然后运行paramiko连接
    目标域
    ,并测试所需内容
  • 我认为这样做的好处是,您可以对所有编程语言执行此操作,而无需重新发明轮子。此外,您和您的继任者将了解系统的细节


    (我的英语不是很好)

    PyPi上提供的第三方
    mock
    模块是作为
    unittest.mock集成到Python 3.3中的。我看到的唯一问题是,我将使用paramiko的很多功能来创建/销毁文件/文件夹等。这意味着我必须为所有这些函数创建一个模拟函数。这感觉就像你没有充分测试生产代码中实际会发生什么。是的,我明白你的意思,我只是厌倦了我会编写大量的模拟函数,这些函数可能不会完全模仿实际的paramiko函数,因此我最终会得到一个通过的测试套件,但是当我真的尝试用它来处理真实的东西时会失败我在使用paramiko时也遇到了同样的问题,我模仿了paramiko的输出,一切都很好,然后使用真实的sftp连接,我不得不重新编写很多代码。Paramiko的
    cwd
    管理有时会很棘手(如果你
    chdir
    很多)。我知道构建一个假的sftp服务器是额外的痛苦,但如果你的应用程序中有很多不同的sftp操作,那么它肯定是值得的。