2017-12-08 8 views
2

私はtest_case_paramsという名前のテストケースを持っています。いくつかのパラメータ(模擬データをclass Mock_dataから)をフィクスチャに渡し、テストケースの戻り値をチェックする必要があります。 @pytest.mark.parametrizeとテストケースにMock_data.get_mock_dataを使用する別のオプションがありますか?目的は、すべてのテストケースが同じモックデータを使用していることを確認することです。私がこれまで行ってきたことはmock_data変数を作成して、TestSuit全体がTestFixureから継承されているので、すべてのテストケースにわたって使用できるようにすることです。しかし、私はどのようにpytest.mark.parametrizeの部分を書くことができないのか分かりません。@ pytest.mark.parametrizeのクラス変数の使い方

import pytest 
class Mock_data: 
    @staticmethod 
    def get_mock_data(): 
     return [1,2,3,4,5] 

class TestFixure(object): 
    @pytest.fixture(scope='function') 
    def func_fixture(self, request): 
     print('#do something in fixure{}'.format(request.param)) 
     return request.param 

     def fin(): 
      print('#do something on finalizer') 
     request.addfinalizer(fin) 

    @classmethod 
    def setup_class(cls): 
     super(TestFixure, cls).setup_class() 
     cls.mock_data = Mock_data.get_mock_data() 

    @classmethod 
    def teardown_class(cls): 
     super(TestMember, cls).teardown_class() 


class TestSuite(TestFixure): 
    @pytest.mark.parametrize('func_fixture', [Mock_data.get_mock_data()[1], Mock_data.get_mock_data()[2], Mock_data.get_mock_data()[3]], indirect=['func_fixture']) 
    def test_case_params(self, func_fixture): 
     print(func_fixture) 
     assert func_fixture in self.mock_data 

答えて

0

全クラスTestFixureが壊れているようです。 super(TestFixure, cls).setup_class()のような行は、あなたが何かからそれを派生させようとしていることを示唆しています...?

私はこのようなことを初めて自分自身で考え出すのは苦労したので、コード例を書き直しました。私はそれが何をしたいん信じて、私はそれが治具とパラメータ化の概念がどのように機能するかを理解するのに役立ちます願っています:

import pytest 

class __mock_data_class__: 

    def __init__(self): 
     self.vector = [2, 3, 4, 5, 6] 

    def do_something(self, parameter): 
     return self.vector[parameter] - 2 

    def fin(self): 
     self.vector.clear() # demo action at the end ... 

@pytest.fixture(scope = 'function') 
def mock_data(request): 

    mock_data_object = __mock_data_class__() 

    def __finalizer__(): 
     mock_data_object.fin() 

    request.addfinalizer(__finalizer__) 

    return mock_data_object 

class TestSuite(): 

    @pytest.mark.parametrize('some_parameter', range(0, 5)) 
    def test_case_params(self, mock_data, some_parameter): 
     print(some_parameter) 
     assert some_parameter == mock_data.do_something(some_parameter) 

あなたのモックデータを生成(またはフェッチまたは...)__mock_data_class__というクラスによってれます。 scope = 'function'のおかげで、テストケースごとにmock_data(あなたの例では1つしかありません、test_case_params)と初期化されます。オブジェクトはvectorという名前の "フィールド"にデータを保持します。 mock_dataオブジェクトは、渡されるすべてのパラメータに対してテストケースが呼び出されるまで存続します(range(0, 5)[0, 1, 2, 3, 4]のジェネレータに等しい)。生涯の終わりには、クラスメソッドfinself.vector.clear()のデータを(例として)破壊します。あなたのテストケースはdo_somethingに電話をかけてmock_dataオブジェクトで何かを直接行うことができます。

関連する問題