2017-11-15 2 views
1

Ich versuche, eine Testumgebung mit Pytest zu erstellen. Die Idee besteht darin, Testmethoden in Klassen zu gruppieren.Pytest Befestigung mit Bereich "Klasse" läuft auf jede Methode

Für jede Klasse/Gruppe möchte ich eine config Leuchte anhängen, die parametrisiert wird. Damit kann ich alle Tests mit "Konfiguration A" und dann alle Tests mit "Konfiguration B" und so weiter durchführen.

Aber auch ich möchte eine reset Leuchte, die vor bestimmten Methoden oder allen Methoden einer Klasse ausgeführt werden kann.

Das Problem, das ich habe ist, wenn ich meine reset Befestigung anwenden (ein Verfahren oder eine ganze Klasse), die config Halterung scheint im Funktionsumfang statt des Klassenbereich zu arbeiten. Also, sobald ich die reset Fixture anwenden, wird die config Fixture vor/nach jeder Methode in der Klasse aufgerufen.

Das folgende Stück Code reproduziert das Problem:

import pytest 
from pytest import * 

@fixture(scope='class') 
def config(request): 
    print("\nconfiguring with %s" % request.param) 
    yield 
    print("\ncleaning up config") 

@fixture(scope='function') 
def reset(): 
    print("\nreseting") 

@mark.parametrize("config", ["config-A", "config-B"], indirect=True) 
#@mark.usefixtures("reset") 
class TestMoreStuff(object): 

    def test_a(self, config): 
     pass 

    def test_b(self, config): 
     pass 

    def test_c(self, config): 
     pass 

Der Test zeigt, wie die config Befestigung funktionieren soll, für die ganze Klasse nur einmal ausgeführt werden. Wenn Sie die usefixtures Dekoration auskommentieren, können Sie feststellen, dass die config Leuchte in jeder Testmethode ausgeführt wird. Kann die Vorrichtung reset verwendet werden, ohne dieses Verhalten auszulösen?

+0

Dies ist eigentlich ein Fehler in Pytest 3.2.5: https://github.com/pytest-dev/pytest/issues/2938 –

Antwort

0

Es hängt davon ab, welche Version von Pytest Sie verwenden.

Es gibt einige semantische Probleme, um dies in älteren Versionen von pytest zu implementieren. Diese Idee ist in der älteren Version pytest noch nicht implementiert. Jemand hat bereits einen Vorschlag gemacht, dasselbe zu implementieren. Sie können sich beziehen this

"Fixture Scope funktioniert nicht, wenn parametrisierte Tests parametrisierte Fixtures verwenden". Das war der Fehler. this

Dieses Problem wurde in der neuesten Version von Pytest behoben. Hier ist die commit für die gleiche mit pytest 3.2.5

Ich hoffe, es würde Ihnen helfen.

+0

Danke für die Antwort. Ich verwende derzeit Version 3.2.5 und überprüfe den Fehler, den du erwähnt hast. Ich kann sehen, dass er in meiner Version behoben ist. Aber ich denke, dass diese Korrektur nicht auf Fixtures angewendet wird, die auf Klassen angewendet werden. –

+0

Yeah possible.you kann Bereich 'Sitzung' versuchen, wenn es keine anderen betroffenen Klassen oder Tests gibt. –

0

Wie ich in einem Kommentar erwähnt habe, scheint das ein Fehler in Pytest 3.2.5 zu sein.

Es gibt einen Workaround, der den Umfang einer Parametrisierung "erzwingt". Also, in diesem Fall, wenn Sie die scope="class" in der parametrize Dekorateur enthalten, erhalten Sie das gewünschte Verhalten.

import pytest 
from pytest import * 

@fixture(scope='class') 
def config(request): 
    print("\nconfiguring with %s" % request.param) 
    yield 
    print("\ncleaning up config") 

@fixture(scope='function') 
def reset(): 
    print("\nreseting") 

@mark.parametrize("config", ["config-A", "config-B"], indirect=True, scope="class") 
@mark.usefixtures("reset") 
class TestMoreStuff(object): 

    def test_a(self, config): 
     pass 

    def test_b(self, config): 
     pass 

    def test_c(self, config): 
     pass 
Verwandte Themen