In welcher Reihenfolge werden pytest Fixtures ausgeführt?

10

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?

    
ThiefMaster 04.09.2014, 07:53
quelle

3 Antworten

11

Der einfachste Weg, die Reihenfolge zu steuern, in der Fixtures ausgeführt werden, besteht darin, nur das vorherige Fixture im späteren Fixture anzufordern. Um sicherzustellen, dass b vor a ausgeführt wird:

%Vor%     
Chronial 27.07.2016 11:18
quelle
5

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.

    
ebeezer 18.02.2015 20:18
quelle
3

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.

    
flub 07.09.2014 12:01
quelle

Tags und Links