2016-05-08 6 views
0

Ich bin neu zu pytest (und Python). Ich habe eine Reihe von Dingen, die nur einmal vor all meinen Tests ausgeführt werden (zB: - Starten des Android-Emulators, Erstellen eines Appium-Treibers, Instanziieren aller meiner Seiten-Klassen, damit ich sie in Tests verwenden kann). Übrigens, ich habe meine Tests in mehreren Klassen. Nach wenig Lektüre dachte ich @pytest.yield_fixture(scope="session", autouse=True) den Trick tun würde .. aber das ist nicht das, was ich sehe .. Siehe unten Beispiel ..py.test-Methode nur einmal pro Lauf ausgeführt werden

import pytest 

class TestBase(): 
    @pytest.yield_fixture(scope="session", autouse=True) 
    def fixture_session(self): 
     # start emulator, create driver and instantiate all page 
     # classes with driver create above 
     print "\n in fixture_session! @session " 
     yield 
     # tear down 
     print "in fixture_session after yield @session" 
    @pytest.yield_fixture(scope="module", autouse=True) 
    def fixture_module(request): 
     print 'in fixture_module @module' 
     # tear down 
     yield 
     print "in fixture_module after yield @module" 

class TestOne(TestBase): 
    def test_a(self): 
     # write test with page objects created in TestBase 
     print "in test_a of TestOne" 
    def test_b(self): 
     print "in test_b of TestOne" 

class TestTwo(TestBase): 
    def test_a(self): 
     print "in test_a of TestTwo" 

    def test_b(self): 
     print "in test_b of TestTwo" 

Ausführen dieses

test_base.py 
in fixture_session! @session 
in fixture_module @module 
in test_a of TestOne 
.in test_b of TestOne 
. 
in fixture_session! @session 
in fixture_module @module 
in test_a of TestTwo 
.in test_b of TestTwo 
.in fixture_module after yield @module 
in fixture_module after yield @module 
in fixture_session after yield @session 
in fixture_session after yield @session 

gibt Was bin ich ?? Warum wird @pytest.yield_fixture(scope="session", autouse=True) pro Testklasse ausgeführt und warum ist der Abbruch nach dem vollständigen Testlauf erfolgt? Alles in allem, ist das der richtige Weg, ein Test-Framework in Pytest zu erstellen?

Antwort

0

Dies passiert, weil Sie Ihre Fixtures innerhalb einer Klasse definieren und dann eine Unterklasse erstellen, wodurch die Fixtures zweimal definiert werden.

Stattdessen sollten Sie die Fixtures einfach als normale Funktionen definieren und entweder Ihre Tests als Funktionen definieren oder nicht von einer Basisklasse erben, wenn Sie Klassen zum Gruppieren von Tests verwenden möchten.