2011-01-17 16 views
10

私は、対話型プログラムのテストをサポートするPython用のテストツールを知りたいと思います。私は楽器Josephので、私はそのインタラクティブな動作をエミュレートすることができますしたいと思います対話型のPythonプログラムのテスト

$ python dummy_program.py 

>> Hi whats your name? Joseph 

:たとえば、私はで起動したアプリケーションを持っています。

答えて

1

何を通常(例えば)sys.stdinをからピックアップしたいようにあなたの最善の策は、おそらく依存性の注入では、実際に渡されたオブジェクトであるあなたはこのような何かするかもしれないので:。

import sys 

def myapp(stdin, stdout): 
    print >> stdout, "Hi, what's your name?" 
    name = stdin.readline() 
    print >> stdout "Hi,", name 

# This might be in a separate test module 
def test_myapp(): 
    mock_stdin = [create mock object that has .readline() method] 
    mock_stdout = [create mock object that has .write() method] 
    myapp(mock_stdin, mock_stdout) 

if __name__ == '__main__': 
    myapp(sys.stdin, sys.stdout) 

幸いにも、Pythonはこれを非常に簡単にします。 http://konryd.blogspot.com/2010/05/mockity-mock-mock-some-love-for-mock.html

+1

実際、依存性注入は、道に行く方法です。しかし、何らかの奇妙な理由でコードを変更できない場合は、 'stdin'と' stdout'を 'sys.stdin = mock_stdin'と' sys.stdout = mock_stdout'で直接変更することができます。テスト中にオリジナルが必要だった場合は、元の値を保持する 'sys .__ stdin__'と' sys .__ stdout__'を使うことができました。 – PaoloVictor

2

対話型プログラムをテストする場合は、expectを使用することを検討してください。コンソールプログラムとやりとりするために特別に設計されています(しかし、テストよりもむしろタスクを自動化するために)。

期待している言語が(tcl)に基づいている場合は、pexpectを試すとコンソールプログラムとのやりとりが容易になります。

関連する問題