2013-11-01 67 views
8

我正在使用pytest的parametrize註釋將params傳遞到類中。我能夠使用測試方法中的參數,但是我無法弄清楚如何使用setup_class方法中的參數。pytest:如何將類參數傳遞給setup_class

import pytest 

params = ['A','B','C'] 

@pytest.mark.parametrize('n', params) 
class TestFoo: 

    def setup_class(cls): 
     print ("setup class:TestFoo") 
     # Do some setup based on param 

    def test_something(self, n): 
     assert n != 'D' 

    def test_something_else(self, n): 
     assert n != 'D' 

我嘗試添加 'N' 像測試方法的參數,如:

def setup_class(cls, n): 
     print ("setup class:TestFoo") 
     # Do some setup based on param 

這將導致一個錯誤:

self = <Class 'TestFoo'> 

    def setup(self): 
     setup_class = xunitsetup(self.obj, 'setup_class') 
     if setup_class is not None: 
      setup_class = getattr(setup_class, 'im_func', setup_class) 
      setup_class = getattr(setup_class, '__func__', setup_class) 
>   setup_class(self.obj) 
E   TypeError: setup_class() takes exactly 2 arguments (1 given) 

有一些其他的方式使用setup_class方法中的參數?

回答

-3

您應該將屬性指定給cls以將屬性傳遞給您的測試類。稍後分配給它的所有屬性和函數都將成爲類的屬性/方法。

參數化的裝飾應在類的方法(要測試的方法,不是嗎?)

所以可以使用:

import pytest 

params = ['A','B','C'] 

class TestFoo: 

    def setup_class(cls): 
     cls.n = params 

    @pytest.mark.parametrize('n', params) 
    def test_something(self, n): 
     assert n != 'D' 

    @pytest.mark.parametrize('n', params) 
    def test_something_else(self, n): 
     assert n != 'D' 

    def test_internal(self): 
     assert self.n != params 

測試將在test_internal. It illustrates that PARAMS were set to self.n and now自我失敗.n equals to params`

+2

這並不能真正解決什麼,我試圖做的。在每個測試中,'n'是參數列表中的一個項目。在你的例子中,你將整個列表分配給cls.n. 通過在課堂上做到這一點,我想要的是,對於項目'A',運行特定於項目'A'的設置,然後運行項目'A'的測試。 – user2945303

+0

另外,這是什麼?例如,它甚至不在類中使用裝飾器設置方法,沒有相應的拆卸,等等。 – lpapp

1

你不能。

首先,setup_class僅在每個班級被調用一次,即使parametrize使用過夾具 - 班級只設置一次。

其次,它沒有設計爲採用除cls以外的任何其他參數。它不會接受來自paramterize和其他固定裝置的參數。

作爲一個解決方案,你可以使用參數化夾具與「階級」範圍:

import pytest 

params = ['A', 'B', 'C'] 


@pytest.fixture(
    scope="class", 
    params=params, 
) 
def n(request): 
    print('setup once per each param', request.param) 
    return request.param 


class TestFoo: 

    def test_something(self, n): 
     assert n != 'D' 

    def test_something_else(self, n): 
     assert n != 'D' 

欲瞭解更多信息看http://docs.pytest.org/en/latest/fixture.html#fixture-parametrize