2013-07-18 10 views
16

Ich benutze py.test und frage mich, ob/wie es möglich ist, den Namen des aktuell ausgeführten Tests innerhalb der setup Methode abzurufen, die vor dem Ausführen jedes Tests aufgerufen wird. Betrachten Sie diesen Code:py.test: Wie bekomme ich den Namen des aktuellen Tests von der Setup-Methode?

class TestSomething(object): 

    def setup(self): 
     test_name = ... 

    def teardown(self): 
     pass 

    def test_the_power(self): 
     assert "foo" != "bar" 

    def test_something_else(self): 
     assert True 

Kurz vor TestSomething.test_the_power ausgeführt wird, würde ich Zugang zu diesem Namen in setup wie im Code über test_name = ... skizziert haben möchte, so dass test_name == "TestSomething.test_the_power".

Eigentlich, in setup, ich einige Ressourcen für jeden Test zuweisen. Am Ende, wenn ich mir die Ressourcen anschaue, die durch verschiedene Komponententests erzeugt wurden, würde ich gerne sehen können, welcher von welchem ​​Test erstellt wurde. Am besten wäre es, den Testnamen bei der Erstellung der Ressource zu verwenden.

Antwort

8

Die setup und teardown Methoden scheinen für die Unterstützung Tests für andere Frameworks geschrieben Legacy-Methoden, z.B. Nase. Die nativen Methoden pytest heißen setup_method sowie teardown_method, die die aktuell ausgeführte Testmethode als Argument erhalten. Daher, was ich erreichen will, kann wie so geschrieben werden:

class TestSomething(object): 

    def setup_method(self, method): 
     print "\n%s:%s" % (type(self).__name__, method.__name__) 

    def teardown_method(self, method): 
     pass 

    def test_the_power(self): 
     assert "foo" != "bar" 

    def test_something_else(self): 
     assert True 

Der Ausgang des py.test -s dann:

============================= test session starts ============================== 
platform linux2 -- Python 2.7.3 -- pytest-2.3.3 
plugins: cov 
collected 2 items 

test_pytest.py 
TestSomething:test_the_power 
. 
TestSomething:test_something_else 
. 

=========================== 2 passed in 0.03 seconds =========================== 
0

Versuchen Sie type(self).__name__ vielleicht?

+0

In meinem Beispiel würde dies nur 'TestSomething' bereitstellen. Ich bin hauptsächlich nach dem zweiten Teil des Namens :) –

0

Sie könnten mehrere Tests haben, wobei in diesem Fall ...

test_names = [n for n in dir(self) if n.startswith('test_')] 

... Sie geben alle Funktionen und Instanzvariablen, die mit "test_" in self beginnen. Solange Sie keine Variablen namens "test_something" haben, wird dies funktionieren.

Sie können auch eine Methode setup_method(self, method) anstelle von setup(self) definieren, die vor jedem Testmethodenaufruf aufgerufen wird. Damit erhalten Sie einfach jede Methode als Parameter. Siehe: http://pytest.org/latest/xunit_setup.html

+0

Alle Methoden, die py.test Tests darstellen, beginnen mit 'test'. Was ich hier brauche, ist py.test API, weil py.test alle Tests zuvor gesammelt hat (im Prinzip wie Sie es hier vorgeschlagen haben) und bereits weiß, welcher Test jetzt ausgeführt werden soll. Ich weiß einfach nicht die richtige Frage zu py.test :-) –

+0

Kommentar nach dem Bearbeiten: Ich will nicht einfach eine Liste aller Methoden haben, die mit "test_" beginnen. Von dieser Liste bin ich nach dem einen Namen/der Methode des Tests, der gerade ausgeführt wird *. Und das können nur die py.test-Einbauten erzählen. –

+0

Ich denke, Sie wollen 'setup_method' statt nur' setup' – ejk314

0

Sie könnten das Prüfmodul versuchen versuchen.

Import inspizieren

def foo(): 
    print "My name is: ", inspect.stack()[0][3] 


foo() 

Ausgang: Mein Name ist: foo

+0

Wird von der 'setup'-Methode aufgerufen, gibt dies offensichtlich' setup' zurück. –

+0

Das war sehr hilfreich für mich, danke! – kroe761

35

Sie können dies auch die Request Fixture wie dies mit tun:

def test_name1(request): 
    testname = request.node.name 
    assert testname == 'test_name1' 
+6

** Dies ist die allgemeine Antwort, ** gilt gleichermaßen für beide Testfunktionen und Testmethoden. Während die py.test-Dokumentation normalerweise "spektakulär" ist, ist ihre Dokumentation für das "request" -Highlight ungewöhnlich schrecklich. Das Attribut "request.node" ist nur als "zugrunde liegender Auflistungsknoten" (abhängig vom aktuellen Anforderungsbereich) dokumentiert. " Das ist es. Ich hätte das niemals gefunden - und daran zweifle niemand. Bravo, Froggy Daniel! –

+5

Beachten Sie jedoch, wenn die Testfunktion parametrisiert wurde, enthält 'request.node.name' den eindeutigen Namen mit Parametern, z. 'test_name [param-other_param]'. Daher ist es _safer_, immer ['request.node.originalname'] (http://doc.pytest.org/en/latest/writing_plugins.html#_pytest.python.Function.originalname) zu verwenden, das den ursprünglichen Funktionsnamen liefert intakt. Beachten Sie auch, dass dies ab py.test 3.0 verfügbar ist. – julen

Verwandte Themen