2017-08-28 41 views
1

我正在寫一些使用paramiko的函數來執行命令並在遠程主機上創建文件。我想爲他們編寫一些單元測試,但我不知道最簡單的方法是什麼?這就是我設想爲我的代碼示例概要:在Python中模擬遠程主機

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,但他們似乎對我的使用情況非常複雜,我不知道如何去簡化他們。

回答

1

要回答我自己的問題,我創建了:https://github.com/chrisjsewell/atomic-hpc/tree/master/atomic_hpc/mockssh

隨着自述的討論;它是基於https://github.com/carletes/mock-ssh-server/tree/master/mockssh與由加法基於(實施更SFTP函數)上https://github.com/rspivak/sftpserver

也已進行了如下更改:

  • 訂正users參數,使得無論是private_path_key或密碼可以用於
  • Server上下文管理器添加了一個dirname參數,以便將其設置爲上下文持續時間的根路徑。
  • 修補paramiko.sftp_client.SFTPClient.chdir修復其相對路徑的使用。

查看test_mockssh.py的例子使用。

2

我覺得你真的需要模擬的是paramiko.SSHClient對象。您正在單元測試您的功能my_function,您可以假設paramiko模塊正常工作,並且您需要單元測試的唯一一件事是如果my_function以正確的方式調用此paramiko.SSHClient的方法。

若要模擬模塊,您可以使用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

+1

PyPi提供的第三方'mock'模塊是作爲'unittest.mock'併入到Python 3.3中的。 – chepner

+0

我看到的唯一問題是,我將使用相當多的paramiko的功能來創建/銷燬文件/文件夾等。所以這意味着我必須爲每個人創建一個模擬功能這些功能。這感覺就像你沒有充分測試生產代碼中實際發生的情況。 –

0

如果你想測試遠程連接,遠程文件系統結構和遠程路徑導航,你必須建立一個模擬主機服務器(虛擬機也許)安裝。換句話說,如果你想測試你在主機上的行爲,你必須嘲笑主機。

如果你想測試你的行爲與主機的數據最簡單的方法似乎進行running.t在另一個答案說。

+0

你明白我的意思了,我只是很疲倦,我最終會寫很多模擬函數,可能不會完全模仿實際的paramiko函數,所以我最終會得到一個正在通過的測試套件,但當我真的嘗試使用它與真實的東西時,會失敗 –

+0

我有使用paramiko同樣的問題,我嘲笑paramiko的輸出,一切都很好,然後與真正的sftp連接,我不得不重新做了很多代碼。 Paramiko的'cwd'管理有時可能會非常棘手(如果你'chdir'很多)。我知道構建一個假的sftp服務器是一件非常痛苦的事情,但是如果你在應用程序中有很多不同的sftp操作,那肯定是值得的。 – Hrabal