Skip to content Skip to sidebar Skip to footer

Mock A Remote Host In Python

I am writing some functions, using paramiko, to execute commands and create files on a remote host. I would like to write some unit tests for them, but I don't know what would be t

Solution 1:

I think what you really need to mock is paramiko.SSHClientobject. 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 the Server 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:

  1. 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
  2. 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"