Comment tester unitaire une fonction contenant l'heure actuelle à l'aide de Freezegun en Python

Bonjour sekitaka.

Aujourd'hui, je vais vous montrer comment tester une fonction qui utilise datetime.now ().

Par exemple, supposons que vous souhaitiez créer une fonction qui renvoie la chaîne "AAAAMMJJ" le lendemain après avoir exécuté un programme et tester cette fonction.

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

Méthode d'essai

Proposition 1

Tout d'abord, j'ai brièvement écrit le code de test suivant. Mais comme vous pouvez le voir, cela ne réussit que si vous exécutez le test le 22 juin 2017. Cela entraînera une erreur lors des tests quotidiens avec CI.

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

Proposition 2

L'idée suivante était de générer dynamiquement la valeur attendue. Cela passera le test chaque fois que vous le testerez. Cependant, en fait, j'ai écrit le même code que get_tomorrow, et j'ai l'impression qu'il n'a pas été testé.

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())

Proposition 3

Par conséquent, j'ai pensé qu'il serait préférable de convertir datetime.now () en Mock, de renvoyer un datetime arbitraire et d'exécuter get_tomorrow. Et j'ai écrit le code suivant.

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())

Quand je l'ai exécuté avec espoir, il semblait que je ne pouvais pas définir l'attribut sur la date / heure intégrée, donc je ne pouvais pas l'exécuter.

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

Proposition 4 (réponse)

Quand j'étais en difficulté, j'ai trouvé une bibliothèque appelée freezegun qui se moquait du module datetime.

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

Le courant est fixé à 2017/1/1 par la description de @freeze_time (" 2017-01-01 "). Ainsi, get_tomorrow () retournera toujours " 20170102 " et réussira à chaque fois que vous exécuterez le test. Si vous modifiez la date de freeze_time, ce sera pratique car vous pouvez vérifier si le programme fonctionne normalement au fil des ans ou dans l'année de gonflement.

Résumé

Qu'as-tu pensé. J'ai présenté comment tester une fonction qui dépend de datetime.now () de python. Il est nécessaire de créer un cas de test afin que le test unitaire puisse être exécuté une fois et non terminé, mais puisse être exécuté à tout moment si le CI est tourné. Je souhaite continuer à apprendre les méthodes de test.

Recommended Posts

Comment tester unitaire une fonction contenant l'heure actuelle à l'aide de Freezegun en Python
Comment connaître le répertoire actuel en Python dans Blender
Comment exécuter une commande à l'aide d'un sous-processus en Python
[Circuit x Python] Comment trouver la fonction de transfert d'un circuit en utilisant Lcapy
Comment utiliser la méthode __call__ dans la classe Python
Comment générer une requête à l'aide de l'opérateur IN dans Django
Pour renvoyer char * dans une fonction de rappel à l'aide de ctypes en Python
Comment obtenir la dernière (dernière) valeur d'une liste en Python
Comment déterminer l'existence d'un élément sélénium en Python
Comment vérifier la taille de la mémoire d'une variable en Python
[Introduction à Python] Comment utiliser l'opérateur in dans l'instruction for?
Comment vérifier la taille de la mémoire d'un dictionnaire en Python
Une fonction qui mesure le temps de traitement d'une méthode en python
[Python3] Définition d'un décorateur qui mesure le temps d'exécution d'une fonction
Ecrire le test dans la docstring python
Comment obtenir stacktrace en python
Comment diviser et traiter une trame de données à l'aide de la fonction groupby
Comment obtenir la différence de date et d'heure en secondes avec Python
Comment obtenir la valeur du magasin de paramètres dans lambda (en utilisant python)
[Introduction à Python] Comment écrire une chaîne de caractères avec la fonction format
Une note utile lors de l'utilisation de Python après une longue période
Python: je souhaite mesurer proprement le temps de traitement d'une fonction
Comment trier en spécifiant une colonne dans le tableau Python Numpy.
Comment arrêter le programme jusqu'à une date et une heure spécifiques en python
Comment utiliser la bibliothèque C en Python
Comment effacer un taple dans une liste (Python)
Comment incorporer des variables dans des chaînes python
Récupérer l'appelant d'une fonction en Python
Comment créer un fichier JSON en Python
Une manière intelligente de chronométrer le traitement avec Python
Comment notifier les canaux Discord en Python
Comment obtenir les fichiers dans le dossier [Python]
[Python] Comment dessiner un histogramme avec Matplotlib
Comment se moquer d'une fonction publique dans Pytest
[2015/11/19] Comment enregistrer un service localement à l'aide du SDK python avec naoqi os
Comment passer le résultat de l'exécution d'une commande shell dans une liste en Python
[AWS] Lançons un test unitaire de la fonction Lambda dans l'environnement local
[Python] Smasher a essayé de faire du processus de chargement de la vidéo une fonction à l'aide d'un générateur
Continuez à récupérer des tweets contenant des mots-clés spécifiques à l'aide de l'API Streaming en Python
Comment obtenir une liste de fichiers dans le même répertoire avec python
Comment récupérer la nième plus grande valeur en Python
Comment convertir / restaurer une chaîne avec [] en python
Comment obtenir le nom de la variable lui-même en python
Comment écrire une interface graphique à l'aide de la commande maya
Comment obtenir le nombre de chiffres en Python
Comment configurer un environnement Python à l'aide de pyenv
[Introduction à Python] Comment itérer avec la fonction range?
Je veux écrire en Python! (2) Écrivons un test
[Python] Comment développer des variables dans une chaîne de caractères
Comment créer un package Python à l'aide de VS Code
Comment quitter lors de l'utilisation de Python dans Terminal (Mac)
Comment utiliser le modèle appris dans Lobe en Python
Écrire du code dans UnitTest une application Web Python
Comment récupérer plusieurs tableaux à l'aide de slice en python.
[Introduction à Python] Comment arrêter la boucle en utilisant break?
[Python] Comment afficher les valeurs de liste dans l'ordre
Comment lire un csv contenant uniquement des entiers en Python
[Python] Comment appeler une fonction de c depuis python (édition ctypes)
Que signifie le dernier () dans une fonction en Python?