2017-08-28 18 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

readmeについては、 private_path_keyまたはパスワードを使用することができるように、

  • usersパラメータを改訂:それはhttps://github.com/rspivak/sftpserver

    に基づいて次の変更も行われている(多くのSFTP機能を実装する)製の追加とhttps://github.com/carletes/mock-ssh-server/tree/master/mocksshに基づいています

  • がコンテキストマネージャのコンテキストマネージャにdirnameパラメータを追加し、コンテキストの持続時間のルートパスとして設定されるようにします。
  • patched paramiko.sftp_client.SFTPClient.chdir相対パスでその使用を修正します。

例としては、test_mockssh.pyを参照してください。

2

あなたが実際に模擬する必要があるものは、paramiko.SSHClientオブジェクトです。あなたはあなたの関数my_functionをユニットテストしていますが、paramikoモジュールが正しく動作すると仮定することができます。my_functionが正しい方法でparamiko.SSHClientのメソッドを呼び出す場合、単体テストに必要なのは唯一のものです。

paramiko.SSHモジュールを模擬するには、unittest.mockを使用し、test_my_functionの機能を@mock.patch.object(paramiko.SSHClient, sshclientmock)に飾ることができます。 をMockまたはMagicMockのように定義する必要があります。

また、Python 2.7には、unittest.mockと同等のものがいくつかありますが、正確にどこを見つけるか覚えていません。

EDIT:コメントに記載されているように。 python 2.7のために、あなたがリモート接続、リモートファイルシステムの構造とリモートパスのナビゲーションをテストしたい場合は、セット・アップするためにモックホストサーバ(多分VM)を持っているpypimockモジュールを検索し、pip install mock

+1

PyPiで利用可能な第三者 '模擬(mock) 'モジュールは、Python 3.3に' unittest.mock'として組み込まれたものです。 – chepner

+0

これは私が見る唯一の問題は、ファイル/フォルダなどを作成/破壊するためにparamikoの機能をかなり使用することになるということです。このため、私は誰もが模擬関数を作成する必要があります。これらの機能。実際にプロダクションコードで何が起こるかを適切にテストしていないような感じです。 –

0

を使用してインストールすることができます。つまり、ホストであなたの行動をでテストする場合は、ホストをモックする必要があります。

ホストのデータでの動作をテストする場合は、最も簡単な方法はrunning.tと進んでいるようです。

+0

あなたは何を意味しているのですか、私はちょっと疲れてしまいます。実際のparamiko関数を完全には模倣しないモック関数がたくさん書かれてしまいますので、実際に実際に使ってみると失敗するでしょう –

+0

私はparamikoを使って同じ問題を抱えていましたが、私はparamikoの出力を嘲笑し、すべてがうまくいきました。本当のsftp接続では、たくさんのコードをやり直す必要がありました。 Paramikoの 'cwd'管理は(あなたが' chdir'をたくさんしていると)時には微妙になることがあります。私はそれが偽のSFTPサーバーを構築する余分な痛みを知っていますが、あなたはあなたのアプリでは異なるSFTPアクションがたくさんある場合は、それはそれの価値があると確信しています。 – Hrabal

関連する問題