Peut-être qu'unittest est faux, et tearDown devrait toujours fonctionner

By | avril 12, 2019

Cours Python en ligne

J’ai regardé les matchs les plus minces, et vu comment ils sont traités de la manière la plus sereine, le nez et le pytest.

J'ai commencé avec l'hypothèse qu'Unittest était correct.

À présent. Je ne pense pas que ce soit le cas.

Mettre à jour: Hmmm… a changé ma position à ce sujet. … Il existe de meilleurs moyens de garantir le démantèlement. Mais ce fut une discussion intéressante…

De la documentation la plus modeste

Pour tearDown (): “Cette méthode sera appelé uniquement si setUp () réussit, quel que soit le résultat de la méthode de test. "

Pour tearDownClass (): “Si une exception est déclenchée pendant setUpClass, les tests de la classe ne sont pas exécutés. et la classe tearDownClass n'est pas exécutée.

TearDownModule (): «Si une exception est générée dans un setUpModule, aucun des tests du module ne sera exécuté et Le tearDownModule ne sera pas exécuté.

D'ACCORD. Suffisamment clair. Mais est-ce vraiment le bon comportement?

Le raisonnement derrière, à mon avis

Si nous ne faisons qu'une chose dans setUp () et que cette chose échoue, il n'y a rien à nettoyer.

Bon jusqu'à présent.

Où il tombe en morceaux

Mais que se passe-t-il si nous faisons plus d’une chose dans setUp?

Et si, dans setUp, nous:

  1. créer un répertoire temporaire et y créer des fichiers sur lesquels travailler
  2. ouvrir une connexion à une base de données distante
  3. d'autres trucs

Puis, dans tearDown, nous:

  1. nettoyer les «autres choses»
  2. fermer la connexion à la base de données
  3. supprimer le répertoire temporaire et tout son contenu

Et si notre connexion à la base de données échouait et levait une exception?

Dans l'implémentation unitaire et frontale, le répertoire temporaire et les «autres éléments» ne seront pas nettoyés.

Je pense juste que c’est faux.

Si vous voulez protéger pour cela, vous devez utiliser addCleanup () pour attacher des fonctions de nettoyage aux tests.
Ceux-ci seront appelés, même si setUp () lève une exception.

Cela ne fonctionne que pour setUp () / test () / tearDown () / cleanup ().
Cela ne fonctionne pas pour setUpClass ().
Cela ne fonctionne pas pour setUpModule ().

Modification proposée: appelez TOUJOURS tearDown () indépendamment du succès de setUp ()

Cela vaut également pour tearDown (), tearDownClass () et tearDownModule ().

C'est trop tard?

Je ne pense pas.

C’est trop tard pour le paresseux et le nez, il n’est PAS trop tard pour le pytest.
Peut-être pourrions-nous simplement régler le problème ici.

Commentaires, s'il vous plaît

Je veux vraiment savoir ce que les autres en pensent.
Ou est-ce que quelqu'un se soucie même de ce cas extrême de comportement unittest?

À votre santé.