2017-08-22 1 views
2

Ich arbeite mit einer Codebasis welche meistens mit unittest geschrieben wird. Die Tests werden mit Pytest ausgeführt. Ich versuche, die Tests zu vereinfachen, indem ich einige von ihnen parametriere. Um auf dieses Ziel hin zu arbeiten, versuche ich zu lernen, wie pytest Fixtures zu verwenden sind und einige der existierenden unitestbasierten Tests umzuformen. Die aktuellen Tests haben eine globale Befestigung in conftest.py:Chain multiple fixtures pytest/unittest hybrid

@pytest.fixture(autouse=True) 
def register_cleanup(): 
    yield True 
    print("cleaning up database") 

Jetzt möchte ich eine Halterung hinzuzufügen, die zu einem meiner Testmodule, etwas entlang der Linien von

@pytest.fixture() 
def foo_fixture(): 
    print("setup fixture") 
    yield 
    print("tear down fixture") 


class Foo(unittest.TestCase): 
    def setUp(self): 
     print('unittest setUp()') 

    def test(self): 
     print('test') 

jedoch spezifisch ist, Die print() Anweisungen in dieser Modulhalterung werden nie ausgeführt. Als Zwischenschritt behalte ich die auf Unittests basierende Struktur und ergänze sie. Ist es möglich, dies so zu machen, wie ich es will, oder muss ich Unittest komplett verwerfen und direkt zu Pytest gehen?

+0

Wo würden Sie diese Leuchte erwarten verwendet werden? Wolltest du auch hier 'autouse = True' einschalten? Im Allgemeinen werden Fixtures nur ausgeführt, wenn sie ein Parameter für den Test sind, und sie sind weniger allgemeine Aufreinigungsmechanismen als Bereichsvoraussetzungen. – Cireo

+0

@Cireo Meinst du, ich sollte 'foo_fixture()' 'autouse = True' ähnlich wie 'register_cleanup hinzufügen() '? –

+0

@Cireo Fühlen Sie sich frei, dies als Antwort zu posten. –

Antwort

1

Sie wollen werden es markieren:

@pytest.mark.usefixtures("foo_fixture") 
class Foo(unittest.TestCase): 
    ... 

Hinweis: Sie können mehr als eine conftest.py haben. Setzen Sie das spezifischere Fixture in dieses Test-Unterverzeichnis conftest.py.

+0

Danke.Ich muss die notwendigen Details verpasst haben, während ich die Dokumente überfliege. –

+0

Leider befinden sich alle Tests in einem einzigen Verzeichnis. Wenn ich umgestalte, werde ich versuchen, sie besser zu organisieren. –

0

Wo würden Sie erwarten, dass dieses Gerät verwendet wird?

Möchten Sie auch hier autouse=True einschalten? Im Allgemeinen werden Fixtures nur ausgeführt, wenn sie ein Parameter für den Test sind, und sie sind weniger allgemeine Reinigungsmechanismen als bereichsspezifische Annahmen. Durch Einschalten autouse für diese Befestigung Sie werden im Wesentlichen einen zusätzlichen Setup-Bereinigungsschritt für das aktuelle Modul hinzufügen:

https://docs.pytest.org/en/latest/fixture.html#autouse-fixtures-xunit-setup-on-steroids

Hier sind, wie autouse Leuchten in anderen Bereichen arbeiten:

autouse Befestigungen gehorchen the scope = keyword-argument: Wenn ein automatisches Fixture scope = 'session' hat, wird es nur einmal ausgeführt, egal wo es definiert ist. scope = 'class' bedeutet, dass es einmal pro Klasse usw. ausgeführt wird. Wenn ein automatisches Fixture in einem Testmodul definiert wird, werden alle seine Testfunktionen automatisch verwendet. Wenn ein automatisches Fixture in einer Datei conftest.py definiert ist, rufen alle Tests in allen Testmodulen unterhalb des Verzeichnisses das Fixture auf. Zuletzt, und bitte verwenden Sie das mit Vorsicht: Wenn Sie ein automatisches Fixture in einem Plugin definieren, wird es für alle Tests in allen Projekten, in denen das Plugin installiert ist, aufgerufen. Dies kann nützlich sein, wenn ein Gerät nur in Anwesenheit bestimmter Einstellungen funktioniert. E. G. in der Ini-Datei. Solch ein globales Gerät sollte immer schnell feststellen, ob es irgendeine Arbeit tun sollte und andernfalls teure Importe oder Berechnungen vermeiden.

[Adaptied Kommentar in einer Antwort]