python - create - django test template



Django setUpTestData() vs setUp() (2)

Django 1.8 est livré avec un TestCase refactoré qui permet l'initialisation des données au niveau de la classe à l'aide de transactions et de points de sauvegarde via la méthode setUpTestData() . Cela contraste avec setUp() qui est exécuté avant chaque méthode de test.

Question: Quel est le cas d'utilisation de setUp() dans Django maintenant que setUpTestData() existe?

Je ne cherche que des réponses objectives et de haut niveau, sinon cette question serait trop vaste pour Stack Overflow.


Answer #1

Extrait de ce tutoriel de test: https://developer.mozilla.org/en-US/docs/Learn/Server-side/Django/Testing#Views

setUpTestData () est appelée une fois au début de l'exécution du test pour une configuration au niveau classe. Vous l'utiliseriez pour créer des objets qui ne seront ni modifiés ni modifiés par aucune des méthodes de test.

setUp () est appelé avant chaque fonction de test pour configurer tous les objets susceptibles d'être modifiés par le test (chaque fonction de test obtiendra une version "fraîche" de ces objets).


Answer #2

Il n'est pas rare qu'il y ait un code d'installation qui ne puisse pas être exécuté en tant que méthode de classe. Un exemple notable est le client de test Django: vous ne voudrez peut-être pas réutiliser la même instance de client avec des tests partageant une grande partie des mêmes données; pour toute la classe. Supposons que vous ayez eu un test du monde antérieur à Django 1.8 avec une méthode setUp comme celle-ci:

    def setUp(self):
        self.the_user = f.UserFactory.create()
        self.the_post = f.PostFactory.create(author=self.the_user)
        self.client.login(
            username=self.the_user.username, password=TEST_PASSWORD
        )
        # ... &c.

Vous pourriez être tenté de moderniser le setUp de setUp en setUpTestData setUp par setUpTestData , en @classmethod un décorateur @classmethod sur le dessus et en modifiant tous les éléments de self en cls . Mais cela échouera avec un AttributeError: type object 'MyTestCase' has no attribute 'client' ! À la place, vous devez utiliser setUpTestData pour les données partagées et setUp pour le client par méthode de test:

    @classmethod
    def setUpTestData(cls):
        cls.the_user = f.UserFactory.create()
        cls.the_post = f.PostFactory.create(author=cls.the_user)
        # ... &c.

    def setUp(self):
        self.client.login(
            username=self.the_user.username, password=TEST_PASSWORD
        )

Remarque: si vous vous demandez ce que fait la variable f dans l'exemple de code, elle provient de factoryboy , une bibliothèque de fixtures utile pour créer des objets pour vos tests.





unit-testing