[PYTHON] Lors de l'écriture d'un test en utilisant DB avec django, il peut être plus rapide d'utiliser `setUpTestData ()`

Lors de l'écriture d'un test en utilisant DB avec django, il peut être plus rapide d'utiliser setUpTestData ()

Lorsque vous écrivez un test en utilisant DB avec django, vous pourrez peut-être le faire plus rapidement en utilisant setUpTestData ().

setUpTestData()

setUpTestData () est généralement setUp () pour chaque méthode Il s'agit d'effectuer l'initialisation du modèle, etc., qui est effectuée dans ce qui précède, classe par classe. (Cela peut être un peu intéressant si vous jetez un œil à l'implémentation interne.)

Bien sûr, être initialisé classe par classe signifie qu'il ne sera appelé qu'une seule fois, vous devez donc faire attention aux choses qui mettent à jour leur statut.

Exemple

Par exemple, supposons que vous écriviez un test pour une recherche de django.contrib.auth.models.User dans Texto. (Il n'y a aucune raison particulière de choisir ʻUser`. C'était juste un désordre pour définir le modèle.)

Appeler setUp () à chaque fois

Dans les cas de test suivants, des modèles utilisateur sont générés pour le nombre de méthodes de test. lent.

class Tests(TestCase):
    def setUp(self):
        from django.contrib.auth.models import User
        for i in range(110):
            User.objects.create_superuser("admin{}".format(i), "myemail{}@example.com".format(i), '')

    def test_query(self):
        from django.contrib.auth.models import User
        with self.assertNumQueries(1):
            actual = User.objects.filter(username__startswith="admin1").count()
            self.assertEqual(actual, 11)

    def test_query1(self):
        from django.contrib.auth.models import User
        with self.assertNumQueries(1):
            actual = User.objects.filter(username__startswith="admin1").count()
            self.assertEqual(actual, 11)

    def test_query2(self):
        from django.contrib.auth.models import User
        with self.assertNumQueries(1):
            actual = User.objects.filter(username__startswith="admin1").count()
            self.assertEqual(actual, 11)

Utilisation de setUpTestData ()

class Tests(TestCase):
    @classmethod
    def setUpTestData(cls):
        from django.contrib.auth.models import User
        for i in range(100):
            User.objects.create_superuser("admin{}".format(i), "myemail{}@example.com".format(i), '')

    def test_query(self):
        from django.contrib.auth.models import User
        with self.assertNumQueries(1):
            actual = User.objects.filter(username__startswith="admin1").count()
            self.assertEqual(actual, 11)

    def test_query1(self):
        from django.contrib.auth.models import User
        with self.assertNumQueries(1):
            actual = User.objects.filter(username__startswith="admin1").count()
            self.assertEqual(actual, 11)

    def test_query2(self):
        from django.contrib.auth.models import User
        with self.assertNumQueries(1):
            actual = User.objects.filter(username__startswith="admin1").count()
            self.assertEqual(actual, 11)

Comparaison du temps d'exécution

Comparons le temps d'exécution. Plus setUp () est appelé autant que le nombre de méthodes de test, plus il sera lent, et le rapport des résultats n'est pas très significatif. Puisqu'il existe 3 méthodes de test, il faut environ 3 fois plus de temps pour générer des données avec setUp ().

setUp setUpTestData
nombre d'utilisateurs 100 100
Nombre de méthodes d'essai 3 3
temps écoulé 11.7s 3.6s

Si vous voulez l'essayer, vous pouvez le vérifier avec l'essentiel suivant.

https://gist.github.com/podhmo/ffc6f96e4688dfb53810f4e4d6ba4d92

Recommended Posts

Lors de l'écriture d'un test en utilisant DB avec django, il peut être plus rapide d'utiliser `setUpTestData ()`
Choses à faire lorsque vous commencez à développer avec Django
Que faire lorsqu'une vidéo ne peut pas être lue par cv2.VideoCapture
Que faire si vous obtenez un avertissement "Mauvaise plateforme Python" lors de l'utilisation de Python avec l'EDI NetBeans
Lorsque vous souhaitez l'utiliser tel quel lorsque vous l'utilisez avec lambda memo
Lorsque vous souhaitez remplacer une colonne par une valeur manquante (NaN) colonne par colonne
Il est plus pratique d'utiliser csv-table lors de l'écriture d'une table avec python-sphinx
Une histoire qui nécessitait des préparatifs pour essayer de faire un tutoriel Django avec des centos simples
Un débutant a essayé de colorier un dessin au trait avec un chainer. J'ai pu le faire.
Lorsque vous souhaitez filtrer avec le framework Django REST
Mot de passe oublié pour un PDF avec mot de passe? pdfcrack peut faire quelque chose à ce sujet
[Django] Mémorandum lorsque vous souhaitez communiquer de manière asynchrone [Python3]
[AWS] Que faire lorsque vous souhaitez piper avec Lambda
Comment résoudre la protection CSRF lors de l'utilisation d'AngularJS avec Django
[Pour les débutants en informatique] Que faire lorsque la commande rev ne peut pas être utilisée avec Git Bash
Si vous écrivez un test piloté par table go en python, il peut être préférable d'utiliser subTest
Quand il est difficile de copier ce que vous avez construit avec vue
Que faire si vous obtenez une erreur de décodage Unicode avec l'installation de pip
Lorsque vous souhaitez envoyer un objet avec des requêtes à l'aide de flask
Lorsque vous souhaitez trier une liste multidimensionnelle sur plusieurs lignes
[Django] Je voulais tester lors du POST d'un fichier volumineux [TDD]
[Astuces] Comment étendre le modèle lors de la création de HTML avec django