2013-11-01 8 views
8

Ich verwende pytests parametrize Annotationen, um params in eine Klasse zu übergeben. Ich kann die Parameter in den Testmethoden verwenden, aber ich kann nicht herausfinden, wie man die Parameter in der Methode setup_class verwendet.pytest: Wie man einen Klassenparameter an setup_class übergeben kann

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' 

Ich habe versucht, Hinzufügen von 'n' als Parameter wie die Testmethoden, wie folgt aus:

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

Welche zu einem Fehler führt:

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) 

Gibt es eine andere Art und Weise von Verwenden Sie den Parameter in der Methode setup_class?

Antwort

-3

Sie sollten Attribute an Ihre Testklasse übergeben, indem Sie sie cls zuweisen. Alle Attribute und Funktionen, die Sie später zuweisen, werden zu Klassenattributen/Methoden.

Parametrisierte Dekorateur sollte auf Klassenmethoden verwendet werden (Sie wollen Methoden testen, nicht wahr?)

So:

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 auf test_internal. It illustrates that params were set to self.n and now selbst scheitern .n equals to params`

+2

aussehen Dies löst nicht wirklich was zu tun ist Ich versuche. In jedem Test ist "n" ein Element aus der Liste der Params. In Ihrem Beispiel ordnen Sie die gesamte Liste cls.n zu. Indem ich es auf Klassenebene mache, was ich will ist, für Element 'A', führe Setup spezifisch für Element 'A', dann führe Tests für Element 'A' aus. – user2945303

+0

Und was ist das? Zum Beispiel verwendet es nicht einmal den Dekorator für die Setup-Methode in der Klasse, hat keine entsprechende Abreißfunktion und so weiter. – lpapp

1

Sie können nicht.

Zunächst wird setup_class nur einmal pro Klasse aufgerufen, auch wenn parametrize Fixture verwendet wird - Klasse wird nur einmal eingerichtet.

Zweitens ist es nicht entworfen, um andere Parameter als cls zu nehmen. Es werden keine Parameter von paramterize und anderen Geräten akzeptiert.

Als Lösung können Sie eine parametrisierte Befestigung mit „Klasse“ Bereich verwenden:

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' 

Weitere Infos bei http://docs.pytest.org/en/latest/fixture.html#fixture-parametrize

Verwandte Themen