2017-04-01 15 views
2

pytestプラグインを作成しています。このプラグインは、特定の環境のセット内で動作するように設計されたソフトウェアをテストする必要があります。pytestでモジュールインポートを模擬しました

私が書いているソフトウェアは、より大きなフレームワークの中で実行されています。これは、特定のPythonモジュールを、フレームワーク内でPythonソフトウェアを実行している場合に限り使用できるようにします。

私のソフトウェアをテストするためには、私はモジュール全体(実際にはかなりの数)を "模擬"または偽造する必要があります。私は同様の見た目の何らかの形でその機能を実装する必要がありますが、私の疑問はpy.testプラグインを使用して、この偽のPythonモジュールを私のソフトウェアのコードでどのように利用できるようにするべきかということです。例えば

、のは、私は私のソースファイルのいずれかで、次のコードを持っていると仮定してみましょう:fwlibモジュールは唯一私がから私のソフトウェアを実行するフレームワークによって利用可能にされ、しかし

import fwlib 

def fw_sum(a, b): 
    return fwlib.sum(a, b) 

、と私はテストすることはできませんその中。

fwlibという名前のモジュールが既にsys.modulesに定義されていることをpytestプラグインから確認するにはどうすればよいですか?確かに、自分でfwlib.sumを実装する必要があります。私はちょうどそれを行う方法についての推奨事項を探しています。

答えて

1

pytestは、このユースケースのフィクスチャを提供します。monkeypatch.syspath_prepend

sys.pathのインポート先リストのパスを前に付けることができます。偽物fwlib.pyを書き、必要に応じてディレクトリを追加してテストに含めます。他のテストモジュールと同様に、ディストリビューションに含める必要はありません。

これをプレイした後、私は実際にライブラリコードからモジュールレベルのインポートを正しく模倣する方法を見つけられませんでした(これを読んでいる人が正しいディレクトリ構造を見つけたら、回答を投稿してください!)。

しかし、私はconftest.pywhich gets imported firstの中から名前を注入することができます。後続のimport文は、すでにsys.modulesに存在するオブジェクトを再利用するだけです。

パッケージ構造:conftest.py

$ tree . 
. 
├── conftest.py 
├── lib 
│   └── my_lib.py 
└── tests 
    └── test_my_lib.py 

2 directories, 3 files 

内容:

import sys 

def fwlib_sum(a, b): 
    return a + b 

module = type(sys)('fwlib') 
module.sum = fwlib_sum 
sys.modules['fwlib'] = module 

ライブラリモジュール:

import fwlib 

def fw_sum(a, b): 
    return fwlib.sum(a, b) 

テストモジュール:

import my_lib 

def test_sum(): 
    assert my_lib.fw_sum(1, 2) == 3 
+0

これは素晴らしいです、ありがとう!あなたは最後の声明を明確にしてください、それが配布に含まれる必要はないと思いますか? – NirIzr

+0

おそらく '。/ tests /'サブディレクトリがあります。これは、配布を作成するときに 'setup.py'ファイルでパッケージ化されていません。テスト実行中にインポートできる '。/ tests/mocks/fwlib.py'などを作成することができますが、ライブラリと一緒に配布されません。 – wim

+0

ああ、そうです。私は他の答えが来る(少しはありそうもない)ためにちょっと待って、すぐに受け入れます。再度、感謝します! – NirIzr

関連する問題