So testen Sie eine Funktion, die die aktuelle Zeit enthält, mit Freezegun in Python

Hallo Sekitaka.

Heute zeige ich Ihnen, wie Sie eine Funktion testen, die "datetime.now ()" verwendet.

Angenommen, Sie möchten eine Funktion erstellen, die am nächsten Tag nach dem Ausführen eines Programms die Zeichenfolge "JJJJMMTT" zurückgibt, und diese Funktion testen.

def get_tomorrow():
    now_datetime = datetime.now()
    tomorrow_datetime = now_datetime + timedelta(days=+1)
    tomorrow = tomorrow_datetime.strftime("%Y%m%d")
    return tomorrow

Testmethode

Vorschlag 1

Zuerst habe ich kurz den folgenden Testcode geschrieben. Wie Sie sehen, ist dies jedoch nur erfolgreich, wenn Sie den Test am 22. Juni 2017 ausführen. Dies führt zu einem Fehler beim täglichen Testen mit CI.

class Test(TestCase):
    def test_get_tomorrow(self):
        self.assertEqual("20170623", get_tomorrow())

Vorschlag 2

Die nächste Idee war, den erwarteten Wert dynamisch zu generieren. Dies besteht den Test immer dann, wenn Sie ihn testen. Tatsächlich habe ich jedoch den gleichen Code wie get_tomorrow geschrieben und ich habe das Gefühl, dass er nicht getestet wurde.

class Test(TestCase):
    def test_get_tomorrow(self):
        expect_tomorrow = (datetime.now() + timedelta(days=+1)).strftime("%Y%m%d")
        self.assertEqual(expect_tomorrow, get_tomorrow())

Vorschlag 3

Daher dachte ich, dass es besser wäre, "datetime.now ()" zu verspotten und "get_tomorrow" in einem Zustand auszuführen, in dem eine beliebige datetime zurückgegeben wird. Und ich habe den folgenden Code geschrieben.

from mock import Mock
class Test(TestCase):
    def test_get_tomorrow(self):
        datetime.now = Mock(return_value=datetime(year=2017, month=1, day=1))
        self.assertEqual("20170102", get_tomorrow())

Wenn ich es mit Erwartung ausgeführt habe, konnte ich es nicht ausführen, da ich das Attribut anscheinend nicht auf die integrierte Datums- / Uhrzeitangabe festlegen konnte.

TypeError: can't set attributes of built-in/extension type 'datetime.datetime'

Vorschlag 4 (Antwort)

Als ich in Schwierigkeiten war, fand ich eine Bibliothek namens freezegun, die das datetime-Modul verspottete.

from freezegun import freeze_time
class Test(TestCase):
    @freeze_time("2017-01-01")
    def test_get_tomorrow_4(self):
        self.assertEqual("20170102", get_tomorrow())

Der Strom wird durch die Beschreibung von "@freeze_time (" 2017-01-01 ")" auf 2017/1/1 festgelegt. "Get_tomorrow ()" gibt also immer "20170102" zurück und ist erfolgreich, wenn Sie den Test ausführen. Wenn Sie das Datum freeze_time ändern, ist dies praktisch, da Sie überprüfen können, ob das Programm über die Jahre oder im Quelljahr normal funktioniert.

Zusammenfassung

Was haben Sie gedacht. Ich habe vorgestellt, wie man eine Funktion testet, die von Pythons datetime.now () abhängt. Es ist erforderlich, einen Testfall zu erstellen, damit der Komponententest einmal ausgeführt und nicht abgeschlossen werden kann, aber jederzeit ausgeführt werden kann, wenn das CI gedreht wird. Ich möchte weiter über Testmethoden lernen.

Recommended Posts

So testen Sie eine Funktion, die die aktuelle Zeit enthält, mit Freezegun in Python
Wie Sie das aktuelle Verzeichnis in Python in Blender kennen
So führen Sie einen Befehl mit einem Unterprozess in Python aus
[Circuit x Python] So ermitteln Sie die Übertragungsfunktion eines Schaltkreises mit Lcapy
Verwendung der Methode __call__ in der Python-Klasse
So generieren Sie eine Abfrage mit dem IN-Operator in Django
So geben Sie char * in einer Rückruffunktion mit ctypes in Python zurück
So erhalten Sie den letzten (letzten) Wert in einer Liste in Python
So bestimmen Sie die Existenz eines Selenelements in Python
So überprüfen Sie die Speichergröße einer Variablen in Python
[Einführung in Python] Wie verwende ich den Operator in in der for-Anweisung?
So überprüfen Sie die Speichergröße eines Wörterbuchs in Python
Eine Funktion, die die Verarbeitungszeit einer Methode in Python misst
[Python3] Definition eines Dekorators, der die Ausführungszeit einer Funktion misst
Schreiben Sie den Test in die Python-Dokumentzeichenfolge
Wie bekomme ich Stacktrace in Python?
Teilen und Verarbeiten eines Datenrahmens mithilfe der Groupby-Funktion
So ermitteln Sie mit Python den Unterschied zwischen Datum und Uhrzeit in Sekunden
So erhalten Sie den Wert aus dem Parameterspeicher in Lambda (mit Python)
[Einführung in Python] So schreiben Sie eine Zeichenfolge mit der Formatierungsfunktion
Ein nützlicher Hinweis, wenn Sie Python nach langer Zeit verwenden
Python: Ich möchte die Verarbeitungszeit einer Funktion genau messen
Sortieren durch Angabe einer Spalte im Python Numpy-Array.
So stoppen Sie das Programm bis zu einem bestimmten Datum und einer bestimmten Uhrzeit in Python
Verwendung der C-Bibliothek in Python
So löschen Sie einen Taple in einer Liste (Python)
Einbetten von Variablen in Python-Strings
Holen Sie sich den Aufrufer einer Funktion in Python
So erstellen Sie eine JSON-Datei in Python
Eine clevere Möglichkeit zur Zeitverarbeitung mit Python
So benachrichtigen Sie Discord-Kanäle in Python
So erhalten Sie die Dateien im Ordner [Python]
[Python] Wie zeichnet man mit Matplotlib ein Histogramm?
Wie man eine öffentliche Funktion in Pytest verspottet
[19.11.2015] So registrieren Sie einen Dienst lokal mit dem Python SDK bei naoqi os
So übergeben Sie das Ergebnis der Ausführung eines Shell-Befehls in einer Liste in Python
[AWS] Lassen Sie uns einen Komponententest der Lambda-Funktion in der lokalen Umgebung durchführen
[Python] Smasher hat versucht, den Video-Ladevorgang mithilfe eines Generators zu einer Funktion zu machen
Rufen Sie weiterhin Tweets mit bestimmten Schlüsselwörtern mithilfe der Streaming-API in Python ab
So erhalten Sie mit Python eine Liste der Dateien im selben Verzeichnis
So rufen Sie den n-ten größten Wert in Python ab
So konvertieren / wiederherstellen Sie einen String mit [] in Python
So erhalten Sie den Variablennamen selbst in Python
So schreiben Sie eine GUI mit dem Befehl maya
So ermitteln Sie die Anzahl der Stellen in Python
So richten Sie eine Python-Umgebung mit pyenv ein
[Einführung in Python] Wie iteriere ich mit der Bereichsfunktion?
Ich möchte in Python schreiben! (2) Schreiben wir einen Test
[Python] So erweitern Sie Variablen in einer Zeichenfolge
So erstellen Sie ein Python-Paket mit VS Code
Beenden bei Verwendung von Python in Terminal (Mac)
Verwendung des in Lobe in Python erlernten Modells
Schreiben Sie Code in UnitTest, eine Python-Webanwendung
So rufen Sie mehrere Arrays mit Slice in Python ab.
[Einführung in Python] Wie stoppe ich die Schleife mit break?
[Python] So geben Sie Listenwerte der Reihe nach aus
Lesen von CSVs, die in Python nur Ganzzahlen enthalten
[Python] So rufen Sie eine Funktion von c aus Python auf (ctypes edition)
Was bedeutet das letzte () in einer Funktion in Python?