2017-09-20 10 views
0

Pythonからpytestユニットテストを実行し、pytestフィクスチャを動的に登録する方法を探しています。 Pytestのドキュメントで説明したように、プログラムを使ってテストを実行するときtheir behaviour can be altered with a custom plugin。私は次のセットアップPytestプラグインにフィクスチャをプログラムで登録する

validation.py(実行するテストが含まれています)で起動される

def test_valid(new_fixture): 
    assert new_fixture > 0 

、ここ

import pytest 

new_fixture_value = 36 

class FixtureRegPlugin(object): 
    def pytest_sessionstart(self): 
     print('Test session start') 

     @pytest.fixture 
     def new_fixture(): 
      return new_fixture_value 

pytest.main(['-sv', './validation.py'], plugins=[FixtureRegPlugin()]) 

は、我々は、カスタムプラグインでvalidation.pyでテストを実行していpytest_sessionstartのフックを登録します。このフックはテストセッションの初めに実行され、私は期待どおりに印刷出力を見ることができます。ただし、new_fixtureは登録されていないため、テストは失敗し、「フィクスチャが見つかりません」というエラーが表示されます。

目的は、実行時にフィクスチャの結果を変更することです。その定義をvalidation.pyの中に置くことはできません。

答えて

1

あなた自身のプラグインを書くのではなくconftest.pyファイルに@pytest.fixture(scope='session')を使用したくない理由はありますか?あなたはそれがあなたが探している実行時に治具を変更する機能を達成できますか?

いずれにしても、インデントを変更してselfnew_fixtureの引数に追加すると、それは機能するはずです。

 @pytest.fixture 
     def new_fixture(): 
      return new_fixture_value 

@pytest.fixture(scope='session') 
    def new_fixture(self): 
     return new_fixture_value 

には、コマンドラインで --setup-showでセットアップとティアダウンを表示することができます。 " script.py" の

内容:validation.py

import pytest 


class FixtureRegPlugin(object): 

    @pytest.fixture(scope='session') 
    def session_fixture(self): 
     pass 

    @pytest.fixture(scope='module') 
    def module_fixture(self): 
     pass 

    @pytest.fixture(scope='function') 
    def function_fixture(self): 
     pass 


pytest.main(['--setup-show', './validation.py'], plugins=[FixtureRegPlugin()]) 

内容:

python script.pyを実行
def test_A(session_fixture, module_fixture, function_fixture): 
    pass 

def test_B(session_fixture, module_fixture, function_fixture): 
    pass 

Test session start 
=================================== test session starts 
platform linux -- Python 3.6.2, pytest-3.2.2, py-1.4.34, pluggy-0.4.0 
rootdir: /home/stackoverflow, inifile: 
collected 2 items                                              

validation.py 
SETUP S session_fixture 
    SETUP M module_fixture 
     SETUP F function_fixture 
     validation.py::test_A (fixtures used: function_fixture, module_fixture, session_fixture). 
     TEARDOWN F function_fixture 
     SETUP F function_fixture 
     validation.py::test_B (fixtures used: function_fixture, module_fixture, session_fixture). 
     TEARDOWN F function_fixture 
    TEARDOWN M module_fixture 
TEARDOWN S session_fixture 

=================================== 2 passed in 0.00 seconds 
+0

グレート、ありがとう!プラグインのメソッドとしてフィクスチャを定義することは、まさに私が探していたものでした。あなたの答えを少し簡素化して、他の人にとってより良い利益をもたらしてください。私はそれを受け入れるだろう。すなわち、a)「字下げの変更」が明確ではなく、FixtureRegPluginがメソッドでなければならないことを説明する方法と置き換える方がよい。 b)--setup-showは便利ですが、 'pytest.fixture(scope = 'function')'などは範囲外です。それらを削除し、可能であれば同じ 'validation.py'を使います。トップは、むしろコメントにする必要があります。それ以外の場合は大変感謝します! – rth