Mock A Remote Host In Python
Solution 1:
I think what you really need to mock is paramiko.SSHClient
object. You are unittesting your function my_function
, you can assume paramiko
module works correctly and the only thing you need to unit test is if my_function
calls methods of this paramiko.SSHClient
in correct way.
To mock paramiko.SSH
module you can use unittest.mock and decorate your test_my_function
function with @mock.patch.object(paramiko.SSHClient, sshclientmock)
. You have to define sshclientmock
as some kind of Mock
or MagicMock
first.
Also in python 2.7 there is some equivalent of unittest.mock
but I dont remember where to find it exactly.
EDIT: As @chepner mentioned in comment. For python 2.7 you can find mock
module in pypi and install it using pip install mock
Solution 2:
To answer my own question, I have created: https://github.com/chrisjsewell/atomic-hpc/tree/master/atomic_hpc/mockssh.
As the readme discusses; it is based on https://github.com/carletes/mock-ssh-server/tree/master/mockssh with additions made (to implement more sftp functions) based on https://github.com/rspivak/sftpserver
The following changes have also been made:
- revised
users
parameter, such that either a private_path_key or password can be used - added a
dirname
parameter to theServer
context manager, such that the this will be set as the root path for the duration of the context. - patched
paramiko.sftp_client.SFTPClient.chdir
to fix its use with relative paths.
See test_mockssh.py for example uses.
Solution 3:
If you want to test remote connectivity, remote filesystem structure and remote path navigation you have to set-up a mock host server (a VM maybe). In other words if you want to test your actions on the host you have to mock the host.
If you want to test your actions with the data of the host the easiest way seems to proceed as running.t said in the other answer.
Solution 4:
I agree with HraBal, because of "Infrastructure as code". You can treat virtual machine as a block of code.
For example:
- you can use vagrant or docker to initialize a SSH server and then, and modify your DNS configuration file.
target domain 127.0.0.1
- put application into the server. and run paramiko to connect
target domain
and test what you want.
I think it is the benefit that you can do this for all programming languages and not need to reinvent the wheel . In addition, you and your successors will know the detail of the system.
(My English is not very good)
Post a Comment for "Mock A Remote Host In Python"