2009-08-25 15 views
2

ユニットテスト(Python 3のunittestを使用)で呼び出された関数の途中でユーザ入力をシミュレートするにはどうすればよいですか?たとえば、私はテストしている出力のあるfoo()関数を持っています。Python 3 unittestユーザ入力をシミュレートする

x = input(msg)

、出力は入力に基づいています:foo()機能では、ユーザーの入力を要求

print("input: {0}".format(x))

私は自分をしたいと思いますユニットテストでfoo()を実行し、入力を入力して期待される結果。

答えて

7

ユーザー入力用のダイアログを表示するコードをテストしようとしているときにこの問題が定期的に発生し、同じソリューションが両方で機能するはずです。テスト範囲内のinputという名前にバインドされた新しい関数を、標準のinput関数と同じシグネチャで提供する必要があります。この関数は実際にユーザーにプロンプ​​トを表示せずにテスト値を返します。

def my_test_input(message): 
    return 7 

:あなたのテストやコードは、この注入は、いくつかの方法で設定を行うことができますされているので、私は読者の練習としてそれを残しておきますが、あなたの交換方法は、単純なもののようなものになるかどうかに応じて、明らかに、関連性がある場合はmessageの内容を切り替えて、選択したデータ型を返すこともできます。あなたはまた、多くの状況で同じ置換方法を再利用することができますより柔軟かつ一般的な何かを行うことができます。

def my_test_input(retval, message): 
    return retval 

をし、その後、あなたはinputに部分関数を注入します:

test_input_aを残し
import functools 
test_input_a = functools.partial(my_test_input, retval=7) 
test_input_b = functools.partial(my_test_input, retval="Foo") 

引数をとり、retval引数がすでにバインドされている関数には、test_input_bがあります。

+0

私はこれに似た何かをやりました。 test_input関数 "test_input(msg)"を作成しました。これは、私がテストしているモジュールの入力のデフォルト動作を上書きします: "module.input = test_input"。私はシミュレートされた入力値を、test_input関数の前に定義されたグローバル変数 "sample_input"で設定し、各テストケースの前に設定します。 – royvandewater

2

依存関係のために一部のコンポーネントをテストすることが難しいのは、通常、設計の悪い兆候です。 foo関数は、グローバルinput関数に依存するのではなく、パラメータに依存する必要があります。次に、実稼働環境でプログラムを実行すると、fooが呼び出され、inputの結果が返されます。したがってfooは、次のようになります。

def foo(input): 
    # do something with input 

これにより、テストがはるかに簡単になります。そして、あなたのテストにIOの依存関係がある場合、それらはもはや単体テストではなく、機能テストです。テストの詳細については、Misko Hevery's blogをご覧ください。

+1

多分、*どこか*、誰かがその入力を集めています。その方法をテストするには、UIを操作してそのレベルでテストする機能テストツールに頼るか、注入を行う必要があります。もちろん、UIを操作する機能テストも行うべきですが、それはUIをテストするためだけに使うべきです(例えば、input()は入力したものを受け取ります)、UI以外の実装の詳細に失敗しないようにします。 –

+0

Nickは、テスト対象のシステムがレガシーアプリケーションの場合、リファクタリングが非常に困難であるか、実行するのに時間がかかりますが、実際にはリファクタリングをサポートするいくつかの特性テストが必要な場合は、あなたの方法を使ってください。しかし、アプリケーションが開発中の場合は、ユニットテストが簡単に記述できるようにリファクタリングする必要があります。 –

+0

@Nick Bastin:「たぶん、どこかで、誰かがその入力を集めています。その方法をテストしたいときは...」foo(入力)はそれを行います。これをテストする必要がある「どこかに」というものはありません。 –

関連する問題