Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Comment faire des tests CRUD avec py.test

+2 votes

Je veux écrire des tests (en utilisant pytest) qui crée un objet, le modifie puis le supprime.

Apparemment pytest n’exécute pas les fonctions dans l'ordre dans le fichier. Pourtant j'aimerais bien que la suppression intervienne après la création.

  1. pytest-ordering qui permettrait de définir manuellement l’ordre. Intéressant, mais ça n’a pas l'air maintenu.
  2. Les fixtures qui permettent de faire du setup/teardown. Mais mettre un assert dans un setup me paraît louche, la création ou suppression reste un test à part entière.
  3. Ou alors les testscenarios éventuellement, mais ça me paraît un peu compliqué. Les tests doivent rester fun !

Qu’est-ce que j'ai loupé ? Quelle est la manière de faire ?

demandé 23-Sep-2015 par batisteo (174 points)

2 Réponses

+4 votes
 
Meilleure réponse

Normalement, sauf erreur de ma part, chaque test doit être indépendant des autres et peut donc être exécuté dans n'importe quel ordre.

Normalement, tu dois vider / reremplir ta BDD entre chaque test pour éviter ce type de problèmes. Il doit y avoir un moyen de faire ça dans le setup / teardown de pytest. Du coup, dans cette logique :

  • Si tu veux tester la création : crée une instance dans ta fonction de test. Cette instance sera de toutes façon supprimée lors du teardown
  • Si tu veux tester l'update : crée ton instance dans le setup et accède y dans ta méthode de test. Ou créé en directement une nouvelle dans ton test
  • Pour le delete, idem. Crée une instance dans le setup et dans ton test, tu la supprime. Ou alors tu en crée une que tu supprime directement après.

Je viens de l'echosystème unittest, donc j'écris les tests en classes / méthodes (ce qui simplifie du coup la gestion de ce type de cas). Mais je suis à peu près sur que tu dois pouvoir faire la même chose avec Pytest.

répondu 23-Sep-2015 par eliotberriot (678 points)
sélectionné 24-Sep-2015 par batisteo
+2 votes

Il faut que tu considère chaque test comme indépendant de tous les autres (le coté "unitaire").

Chaque test doit être cohérent avec lui seul et ne pas dépendre d'un état global, même au sein de la même classe de tests (a part un état initial que tu peux injecter dans le setUp()) (et il me semble le setUp() et tearDown() sont d’ailleurs exécutés avant chaque test.)

Donc quand tu veux tester la création/modification/suppression, il faut que ça soit fait au sein du même test.

Tu peux par ex découper tes tests en trois parties (3 tests):

  • creation avec des assert sur les valeurs par defaut attendues
  • creation, modification, assert sur le resultat attendu (ici tu ne reteste pas ce que le premier test a déjà validé)
  • creation / suppression, assert sur le résultat attendu
répondu 23-Sep-2015 par jc (2,674 points)
...