2017-02-03 6 views
1

私のpytestは古いです(バージョン2.8.3)。pytestでは、モジュールレベルのフィクスチャがクラスレベルより前に呼び出されるようにする方法

pytestmark = pytest.mark.usefixtures("module_level") 

@pytest.fixture(scope='module') 
def module_level(request): 
    print("module start") 
    def fin(): 
     print("module end") 
    request.addfinalizer(fin) 

@pytest.fixture(scope='class') 
def class_level(request): 
    print("class start") 
    def fin(): 
     print("class end") 
    request.addfinalizer(fin) 

@pytest.mark.usefixtures("class_level") 
class TestMyClass: 
    def test_func(self): 
     pass 

しかし、私が得たの順序は次のとおりです。

class start 
module start 
class end 
module end 

私が欲しいものではありません。では、モジュールレベルのセットアップ/クリーンアップフィクスチャーを作成する正しい方法は何ですか(そして、すべての前にセットアップを行い、すべての後にクリーンアップすることを確認してください)。

答えて

1

pytestこれらのテストはテストファイルに書き込まれ、必要に応じて順番にロードされます。 fixturesに関するドキュメントを参照してください。

あなたの例では、pytestが最初にクラスtestで始まり、モジュールの依存関係が後で読み込まれます。あなたが最初の「モジュール」設定にしたい場合は

は複数の可能性があります

A)module_levelがclass_levelによってパラメータとして使用し、したがって、(pytestmarkが必要とされていない)

import pytest 

@pytest.fixture(scope='module') 
def module_level(request): 
    print("module start") 
    def fin(): 
     print("module end") 
    request.addfinalizer(fin) 

@pytest.fixture(scope='class') 
def class_level(request, module_level): 
    print("class start") 
    def fin(): 
     print("class end") 
    request.addfinalizer(fin) 

@pytest.mark.usefixtures("class_level") 
class TestMyClass: 
    def test_func(self): 
     pass 

前にロードされていますB)クラス試験の要件としてとして@pytestmark使用し、したがって、フロント

import pytest 

pytestmark = pytest.mark.usefixtures("module_level") 

@pytest.fixture(scope='module') 
def module_level(request): 
    print("module start") 
    def fin(): 
     print("module end") 
    request.addfinalizer(fin) 

@pytest.fixture(scope='class') 
def class_level(request): 
    print("class start") 
    def fin(): 
     print("class end") 
    request.addfinalizer(fin) 

@pytest.mark.usefixtures("class_level") 
@pytestmark 
class TestMyClass: 
    def test_func(self): 
     pass 

Cにロードされる)前にセットアップ機能テストクラステスト、これは、それぞれの場合に、 "クラス" の前でmodule_level最初

import pytest 

pytestmark = pytest.mark.usefixtures("module_level") 

@pytest.fixture(scope='module') 
def module_level(request): 
    print("module start") 
    def fin(): 
     print("module end") 
    request.addfinalizer(fin) 

@pytest.fixture(scope='class') 
def class_level(request): 
    print("class start") 
    def fin(): 
     print("class end") 
    request.addfinalizer(fin) 

def test_case(): 
    assert True 

@pytest.mark.usefixtures("class_level") 
class TestMyClass: 
    def test_func(self): 
     pass 

この負荷 "モジュール" を実行する(pytest-2.8.7):

A)

::TestMyClass::test_func module start 
class start 
class end 
module end 

B)

::TestMyClass::test_func module start 
class start 
class end 
module end 

C)

::test_case module start 
::TestMyClass::test_func class start 
class end 
module end 
関連する問題