2016-08-04 29 views
3

私はpytestを自分のコードにかなり使っています。サンプルコードの構造は次のようになります。pytestでグローバルにパッチを当てるには?

from modules import stuff 
from core.utils import Utility 


class FeatureManager: 
    # lots of other methods 
    def execute(self, *args, **kwargs): 
     self._execute_step1(*args, **kwargs) 
     # some more code 
     self._execute_step2(*args, **kwargs) 
     utility = Utility() 
     utility.doThings(args[0], kwargs['variable']) 

feature/tests/*のすべてのテストはcore.feature.service.FeatureManager.execute機能を使用して終了:全体のコードベースはpython-2.7

core/__init__.py 
core/utils.py 

#feature 

core/feature/__init__.py 
core/feature/service.py 

#tests 
core/feature/tests/__init__.py 
core/feature/tests/test1.py 
core/feature/tests/test2.py 
core/feature/tests/test3.py 
core/feature/tests/test4.py 
core/feature/tests/test10.py 

あるservice.pyは次のようになります。しかし、utility.doThings()は私がテストを実行している間に実行する必要はありません。私はそれが生産アプリケーションが実行されている間に発生する必要がありますが、私はそれがテストが実行されている間に発生したくありません。

私はこれが仕事と私のcore/feature/tests/test1.py

from mock import patch 

class Test1: 
    def test_1(): 
     with patch('core.feature.service.Utility') as MockedUtils: 
      exectute_test_case_1() 

にこのような何かを行うことができます。しかし、私はUtilityをコードベースに追加しました。私は300を超えるテストケースを持っています。私は各テストケースに入り、このwithステートメントを書いてはいけません。 がutility.doThingsを実行できないと判断する可能性のあるOSレベルの環境変数を設定するconftest.pyと書くことができますが、これがこの問題のクリーンな解決方法であるかどうかはわかりません。

誰かがセッション全体のグローバルパッチを手伝ってくれたらと思います。私は、上記のwithブロックを使って、セッション全体でグローバルに処理したことをしたいと思います。この問題の記事はすばらしいことになります。

TLDR:pytestsの実行中にセッションワイドパッチを作成するにはどうすればよいですか?

答えて

3

私は、これは複雑なものではありません。この

import logging 
import pytest 


@pytest.fixture(scope="session", autouse=True) 
def default_session_fixture(request): 
    """ 
    :type request: _pytest.python.SubRequest 
    :return: 
    """ 
    log.info("Patching core.feature.service") 
    patched = mock.patch('core.feature.service.Utility') 
    patched.__enter__() 

    def unpatch(): 
     patched.__exit__() 
     log.info("Patching complete. Unpatching") 

    request.addfinalizer(unpatch) 

のように見えることcore/feature/conftest.pyと呼ばれるファイルを追加しました。それはやっているのと同じですが、セッション全体の方法でのみですが、

with mock.patch('core.feature.service.Utility') as patched: 
    do_things() 

です。

関連する問題