Für eine Anwendung, die ich teste, möchte ich eine autouse=True
Fixture erstellen, die monkeypatches smtplib.SMTP.connect
fehlschlägt, wenn sie versuchen, eine E-Mail unerwartet zu senden.
Wenn ich jedoch erwarte, dass Tests E-Mails senden, möchte ich stattdessen ein anderes Gerät verwenden, das diese E-Mails protokolliert (höchstwahrscheinlich mit smtpserver
Fixture von pytest-localserver
und monkeypatching mit der Methode connect
) der von diesem Gerät zurückgegebene Host / Port)
Natürlich kann das nur funktionieren, wenn das automatische Fixture vor dem anderen Fixture ausgeführt wird (geladen als funcarg). Gibt es eine bestimmte Reihenfolge, in der Fixtures ausgeführt werden und / oder gibt es eine Möglichkeit, die Ausführungsreihenfolge zu garantieren?
Ich hatte gerade dieses Problem mit zwei function
-scoped Autofeuerwaffen. Ich wollte Fixture b
vor der Fixture a
laufen lassen, aber jedes Mal lief a
zuerst. Ich habe mir gedacht, dass es vielleicht eine alphabetische Reihenfolge ist, also habe ich a
in c
umbenannt, und jetzt läuft b
zuerst. Pytest scheint dies nicht dokumentiert zu haben. Es war nur eine glückliche Vermutung. : -)
Das ist für automatische Geräte. Unter Berücksichtigung breiterer Bereiche (z. B. module
, session
) wird ein Fixture ausgeführt, wenn pytest einen Test findet, der es benötigt. Wenn es also zwei Tests gibt und der erste Test ein session
-scoped Fixture namens sb
und nicht das eine namens sa
verwendet, dann wird sb
zuerst ausgeführt. Wenn der nächste Test ausgeführt wird, startet sa
, vorausgesetzt, dass sa
erforderlich ist.
IIRC Sie können sich darauf verlassen, dass höhere Scoped Fixtures zuerst ausgeführt werden. Wenn Sie also ein Session Autofieting auf monkeypatch smtplib.SMTP.connect
erstellt haben, können Sie ein funktionsorientiertes Fixture erstellen, das dieses Monkeypatching für einen Test rückgängig macht und danach wieder herstellt. Ich nehme an, der einfachste Weg dies zu tun ist, ein eigenes smtpserver
Fixture zu erstellen, das sowohl vom disallow_smtp
Fixture als auch vom smtpserver
Fixture von pytest-localserver
abhängt und dann alle Setups und Teardowns erledigt, die benötigt werden, um diese beiden funktionieren zu lassen zusammen.
Dies ist vage, wie pytest-django
seinen Datenbankzugriff behandelt, aber Sie könnten versuchen, den Code dort zu betrachten, aber es ist weit entfernt von einem einfachen Beispiel und hat viele eigene seltsame Dinge.