Ich verwende Selen für End-to-End-Tests und kann nicht verstehen, wie setup_class
und teardown_class
Methoden verwendet werden.
Ich muss den Browser in der setup_class
Methode einrichten , dann eine Reihe von Tests durchführen, die als Klassenmethoden definiert sind, und schließlich den Browser in der teardown_class
Methode beenden .
Aber logischerweise scheint es eine schlechte Lösung zu sein, denn tatsächlich funktionieren meine Tests nicht mit der Klasse, sondern mit dem Objekt. Ich übergebe self
param in jeder Testmethode, damit ich auf die Variablen der Objekte zugreifen kann:
class TestClass:
def setup_class(cls):
pass
def test_buttons(self, data):
# self.$attribute can be used, but not cls.$attribute?
pass
def test_buttons2(self, data):
# self.$attribute can be used, but not cls.$attribute?
pass
def teardown_class(cls):
pass
Und es scheint sogar nicht richtig zu sein, eine Browserinstanz für eine Klasse zu erstellen. Sie sollte für jedes Objekt separat erstellt werden, oder?
Also muss ich __init__
und __del__
Methoden anstelle von setup_class
und verwenden teardown_class
?
resource
Parameter intest_that_depends_on_resource(self, resource)
Meinen Sie beim Schreiben von "als Klassenmethoden definierten Tests" wirklich Klassenmethoden (Methoden, die ihre Klasse als ersten Parameter erhalten) oder nur reguläre Methoden (Methoden, die eine Instanz als ersten Parameter erhalten)?
Da Ihr Beispiel
self
für die Testmethoden verwendet wird, gehe ich von letzterem aus, sodass Siesetup_method
stattdessen nur Folgendes verwenden müssen :Die Testmethodeninstanz wird an
setup_method
und übergebenteardown_method
, kann jedoch ignoriert werden, wenn Ihr Setup- / Teardown-Code den Testkontext nicht kennen muss. Weitere Informationen finden Sie hier .Ich empfehle Ihnen auch, sich mit den Leuchten von py.test vertraut zu machen , da diese ein leistungsfähigeres Konzept darstellen.
quelle
setup_class
mit verspotteten Methoden und dergleichen verwendet wurden, mussten modernisiert werden.setup_class(self, foo, bar)
->setup_method(self,function,foo,bar)
Dies könnte http://docs.pytest.org/en/latest/xunit_setup.html helfen
In meiner Testsuite gruppiere ich meine Testfälle in Klassen. Für die Einrichtung und den Abbau, die ich für alle Testfälle in dieser Klasse benötige, verwende ich die Methoden
setup_class(cls)
undteardown_class(cls)
.Und für die Einrichtung und den Abbau, die ich für jeden Testfall benötige, verwende ich das
setup_method(method)
undteardown_method(methods)
Beispiel:
Wenn ich jetzt meine Tests ausführe und die TestClass-Ausführung startet, werden die Details protokolliert, wann die Ausführung beginnt, wann die Ausführung beendet wird und dasselbe für die Methoden.
Sie können weitere Setup- und Teardown-Schritte an den jeweiligen Standorten hinzufügen.
Ich hoffe es hilft!
quelle
setup_class
vssetup_method
?<setup/teardown>_class
für die ganze Klasse. Hier können Dinge wie das Setzen eines Links zur Datenbank oder das Laden der Datendatei geschehen. Und dann kann jeder Testfall sein eigenes Setup in Form von haben<setup/teardown>_method
. Die Dinge sind jetzt viel klarer. Vielen Dank!Wie @Bruno vorgeschlagen hat, ist die Verwendung von Pytest-Vorrichtungen eine weitere Lösung, auf die beide Testklassen oder auch nur einfache Testfunktionen zugreifen können. Hier ist ein Beispiel zum Testen von Python2.7-Funktionen :
Laufen
test_1...
erzeugt also:Beachten Sie, dass
stuff_i_setup
auf das Gerät verwiesen wird, damit dieses Objekt sein kannsetup
undtorn down
für den Test, mit dem es interagiert. Sie können sich vorstellen, dass dies für ein beständiges Objekt nützlich sein könnte, z. B. eine hypothetische Datenbank oder eine Verbindung, die vor jedem Testlauf gelöscht werden muss, um sie isoliert zu halten.quelle
Ihr Code sollte genau so funktionieren, wie Sie es erwarten, wenn Sie
@classmethod
Dekorateure hinzufügen .Siehe http://pythontesting.net/framework/pytest/pytest-xunit-style-fixtures/
quelle
self
wird beispielsweise für Methoden verwendet, wobei das erste Argument die spezifische Objektinstanz ist, auf der die Methodenoperation stattfindet, währendcls
für@classmethod
s verwendet wird, an die gebunden ist die Klasse und keine Instanz der Klasse (dh ein Objekt).