2012-12-18 14 views
6

ベースクラスを作成しようとしています。私のテストに必要な設定が異なります。すべての私のテストをこのベースクラスから継承したい。ランナーとして私はpy.testを使用します。py.testは 'オブジェクト'から継承されないテストを収集しません

しかし、私がそうしようとすると、py.testはBaseクラスから継承したこれらのテストを収集せず、結果としてそれらを実行しません。ドキュメントに有用な情報が見つかりませんでした。

誰かが以前にこのような問題に直面したことはありますか?何か案は?

ありがとうございました。

P.S.テストがオブジェクトから継承されると、すべて正常に動作します。 Py.testそれらを参照し、正しく実行します。

コードの例:

私の基本クラス:

class BaseClass(object): 
"""BaseClass""" 
def __init__(self): 
    super(BaseClass, self).__init__() 
    self.bla = 'bla' 

私のテストクラス:

import pytest 
from base_class import BaseClass 

class TestSmth(BaseClass): 
    def test_test(self): 
     test_instatnce = TestSmth() 
     print test_instatnce.bla 

if __name__ == '__main__': 
    pytest.main([__file__, '-v']) 

が出力:

============================= test session starts ============================== 
platform darwin -- Python 2.7.2 -- pytest-2.3.3 -- /usr/bin/python 
collecting ... collected 0 items 

=============================== in 0.01 seconds =============================== 
[Finished in 0.4s] 

答えて

5

私はあなたができるとは思いません__init__を使用してください。あなたの場合は、セットアップ(または初期化)クラスにあなたは何を行うことができます。

# base_class.py 

class BaseClass(object): 
"""BaseClass""" 

    @classmethod 
    @pytest.fixture(scope = "class", autouse = True) 
    def setup(self): 
     self.bla = 'bla' 

#test_class.py 

import pytest 
from base_class import BaseClass 

class TestSmth(BaseClass): 
    def test_test(self): 
     print self.bla 

if __name__ == '__main__': 
    pytest.main([__file__, '-v']) 

はまた、あなたが他の「メソッド」を作成し、同様に@pytest.fixtureでそれを飾ることができますTestSmthクラスを初期化します。しかし、それらの「初期化メソッド」は、アルファベット順で呼び出されることを覚えておく必要があります。

+0

アレックス、 ありがとう!それがまさに私が必要なものです! –

+0

フィクスチャ関数はスコープでソートされるので、すべてのクラススコープのフィクスチャは関数スコープのフィクスチャより前に実行されます。各スコープ内で順序は定義されていませんが、アルファベット順であるかもしれませんが、それは同時に発生します。 – hpk42

+0

@ hpk42、それはクラス内のアルファベット順です。 :)自分で試してみることができます:https://bitbucket.org/alex_okrushko/pytest-class-init-order/commits/e3f316d6597c57e22a82362643197140 –

関連する問題