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.
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.)
setUp ()
à chaque foisDans 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)
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)
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