2017-10-13 32 views
1

私はpytestを使用していconftest.pyでpytestを使って環境をmonkeypatchする方法は?

# reporter.py 

from os import environ 
from influxdb import InfluxDBClient 

influxdb_client = InfluxDBClient(host=environ['INFLUXCLOUD_HOST'], 
           username=environ['INFLUXCLOUD_USERNAME'], 
           password=environ['INFLUXCLOUD_PASSWORD'], 
           ssl=True, 
           timeout=4*60) 

def foo(): 
    pass 

私は私のメインのファイルにグローバルオブジェクトを持っていると私は、これらの環境変数に偽の値を設定したいです。私は私のテストファイルで、私はINFLUXCLOUD_HOSTがENVに欠けているKeyErrorを取得import reporterしかし

# conftest.py 

import pytest 

@pytest.fixture(scope='session', autouse=True) 
def setup_env(monkeypatch): 
    monkeypatch.setenv('INFLUXCLOUD_HOST', 'host') 
    monkeypatch.setenv('INFLUXCLOUD_USERNAME', 'username') 
    monkeypatch.setenv('INFLUXCLOUD_PASSWORD', 'password') 

、:私は私のconftest.pyで次があります。

なぜpytestはsetup_envを実行し、私の環境をmonkeypatchしませんか?そうする方法はありますか?

+0

テストファイルを表示して、インポートレポーターをどのように表示できますか? –

答えて

0

ここでの問題は、セッションスコープのフィクスチャが何であるか誤解しています。

& autoused fixturesが存在するテストを知るには、pytestがテストファイル& conftestプラグインをインポートする必要があります。次に、インポートされたモジュールをスキャンし、&テスト関数&テストクラス&などを検索します。これはpytestの用語で "コレクション"と呼ばれます。

すべてのテストが収集された後で、pytestはそれらを実行することを決定し、実行計画をアレンジします。具体的には、備品が準備されているときです。セッションスコープのフィクスチャは、最初に準備され、最後にテストが開始される前と、すべてのテストが終了した後で表示されます。

しかし、テストファイル& conftestをインポートすると、pytestとは無関係に他のPythonモジュールのインポートとして、これらのモジュールの実行が前提となります。

したがって、テストファイルからimport reporterを実行するか、グローバル変数をテストファイルに直接配置しても、このモジュールが実行され、env変数の使用が試行されます。しかし、フィクスチャはまだ実行されていません(pytestはまだそれらの存在について知りません)。したがって、失敗します。

テスト機能の中からimport reporterを入力しても、pytestがコレクション段階の前にそのreporter.pyモジュールをインポートしようとする可能性がありますので、これはあまり役に立ちません。 Pytestは、テスト関数/クラスが存在しないためにフィルタリングを行いますが、インポートが完了して失敗します。

最高の解決策は、クライアントをフィクスチャに「パック」し、グローバル変数の代わりにそのフィクスチャを使用することです。

関連する問題