2016-01-10 14 views
7

どのようにinit()がed(おそらく最高のデザインではないが、書き換えはオプションではない)によってまったく異なる振る舞いを持つ(python3)パッケージがあります。モジュールはinit()にしか適用できません.2度目はエラーとなります。 py.testを使ってこのパッケージ(両方の動作)をテストしたいと思います。py.testテストでpython(またはリロードモジュール)を再起動

注:パッケージの性質上、2つの動作を相互に排他的にするため、単一のプログラムで両方の動作を行う必要はありません。

モジュールtest_xxx.pyモジュールが私のテストディレクトリにあります。各モジュールは、必要に応じて(フィクスチャを使用して)パッケージを初期化します。 py.testはPythonインタプリタを一度起動するので、1つのpy.testですべてのテストモジュールを実行すると失敗します。

第2のinit()を許可するようにパッケージをモンキーパッチすると、内部キャッシングなどが原因で説明できない動作が発生する可能性があるため、やりたいことではありません。

  • それは
  • (それによって、他のテストモジュールでのINITに影響されない)別のPythonのプロセスで各テストモジュールを実行するためにpy.testを伝えることは可能です確実に(パッケージを再ロードする方法はありますすべてのサブ依存関係などを含む)
  • もう一つの解決策がありますか(私はインポートを考えていますが、フィクスチャでパッケージをインポートすることは考えていますが、これは過剰です)。モジュールをリロードするには
+0

私は経験がないが、あなたは、いくつかのサブプロセスを開始し、物事そのように行うには、このプラグインを適応/使用することができる場合がありますhttps://pytest.org/latest/xdistを。 html#running-tests-in-a-python-subprocess –

+0

pytestを1つのファイル( 'pytext text/text_xyz.py)で実行することができれば、test_xyzファイルを見つけてそれぞれを実行するプログラムを書くことができますサブプロセスモジュールと別のプロセス。これはSimeonによって参照されるプラグインが何をしているべきかです。 –

+0

ありがとうございます。 'pytest-xdist'を見ると、残念ながらモジュールごとに新しいサブプロセスが開始されません。確かに私は2つのディレクトリにテストモジュールを用意しています.1つは初期化の一方の方法を使用し、もう一方はもう一方を使用します。それから私はディレクトリごとに一度pytestを実行します。しかし、残念ながら、個々の実行の戻り値とテストレポートが確実に組み合わされるように、スクリプトを追加する必要があります。 – Claude

答えて

1

、ライブラリからreload()を使用してimp

を試してみてください。例:

from imp import reload 
import some_lib 
#do something 
reload(some_lib) 

また、新しいプロセスで各テストを起動することは実行可能であるが、多重処理コードは一種の苦痛ですデバッグする。

import some_test 
from multiprocessing import Manager, Process 

#create new return value holder, in this case a list 
manager = Manager() 
return_value = manager.list() 
#create new process 
process = Process(target=some_test.some_function, args=(arg, return_value)) 
#execute process 
process.start() 
#finish and return process 
process.join() 
#you can now use your return value as if it were a normal list, 
#as long as it was assigned in your subprocess 
+0

私はpython3を使用しているので、 'imp'は' importlib'でなければなりません。このようにモジュールをリロードすると(残念なことに)、そのモジュールのグローバル辞書がクリアされないので、それは役に立ちません。また、それは私が恐れているすべての依存モジュールをリロードしません。新しいプロセスで各テストを実行するのは興味深いようですが、これが 'py.test'とどのように組み合わされているか分かりません。また、各機能ではなく、別々のテストで実行するためには、それぞれの*モジュール*が必要です。 – Claude

関連する問題