exemple facile de fixtures pytest

By | août 9, 2019

trouver un expert Python

Dans les appareils de style pytest xUnit, j’ai présenté un problème où:

  • Deux tests existent dans un fichier de test.
  • On utilise une ressource.
  • L’autre ne le fait pas.
  • Les fixtures au niveau des modules ne fonctionnent pas si vous voulez juste exécuter la fonction qui n’utilise pas la ressource.

J'ai ensuite présenté les installations au niveau de la classe comme un moyen de résoudre le problème de la séparation.

Dans cet article, je vais utiliser des appareils pytest pour résoudre le même problème.
Je ne vais pas entrer dans les détails de tous les goodies que vous obtenez avec les appareils les plus authentiques.
Je vais juste rester à résoudre ce problème.
Dans les prochains articles, je donnerai plus de détails sur les appareils pytest.

le problème

Voici le code qui nous a posé problème la dernière fois:

Le problème est que si je veux juste lancer ‘test_2_that_does_not ()’, les fonctions de fixture pour resource_a sont appelées, même si je n’ai pas besoin qu’elles soient appelées.

la solution de fixation pytest

Au lieu de déplacer les installations et les tests liés à resource_a dans une classe, nous:

  1. Pytest d'importation
  2. Utilisez le décorateur de luminaires pytest pour spécifier ‘resource_a_setup ()’ en tant que luminaire.
  3. Spécifiez le projecteur en tant que portée du module. Ainsi, si deux tests en ont besoin, l'installation / le démontage ne sera appelé qu'une fois.
  4. Indiquez "resource_a_teardown ()" comme finaliseur pour "resource_a_setup ()". Pour ce faire, nous devons ajouter un paramètre ‘request’ à la fonction de configuration. Notez également que la fonction de finalisation peut être très locale à la fonction de configuration, même définie dans celle-ci.
  5. Incluez "resource_a_setup" dans la liste des paramètres pour les tests utilisant resource_a.

Je vais également ajouter une fonction de test supplémentaire qui utilise la ressource pour prouver que la portée du module fonctionne.

Pour que les appareils pytest fonctionnent, les étapes n ° 1, n ° 2 et n ° 5 sont tout ce dont vous avez vraiment besoin.
L’étape 3 n’est nécessaire que si vous souhaitez modifier la valeur par défaut (‘function’).
L'étape 4 n'est nécessaire que si vous souhaitez inclure une fonction de démontage.

Donc, voici mon code.

N'exécutant que 'test_2_that_does_not':

Tout courir:

quelques avantages des luminaires pytest

Nous pouvons immédiatement constater des avantages intéressants.

  • Il est évident que les tests utilisant une ressource sont listés dans la liste des paramètres de test.
  • Je n'ai pas besoin de créer artificiellement des classes (ni de déplacer des tests d'un fichier à un autre) pour séparer l'utilisation des fixtures.
  • Le code de démontage est étroitement associé au code d'installation d'une ressource.
  • L'étendue de la durée de vie de la ressource est spécifiée à l'emplacement du code d'installation de la ressource. Cela finit par être un énorme avantage lorsque vous voulez manipuler la portée pour gagner du temps sur les tests. Si tout commence à se dégrader, c’est une modification d’une ligne permettant de spécifier l’étendue de la fonction et d’instaurer / de supprimer toutes les fonctions / méthodes.
  • C’est moins de code. La solution pytest est plus petite que la solution de classe.

un exemple encore plus petit

J'ai indiqué précédemment dans la solution que les étapes 3 et 4 sont facultatives.
Jetons un coup d’œil au code simplifié si nous allons simplement avec les valeurs par défaut.

La différence?

  • Pas de code de démontage (finaliseur). Donc, pas besoin d'un paramètre de demande pour la fonction d'installation.
  • Aucune portée spécifiée. La valeur par défaut appelle "resource_a" avant chaque fonction / méthode qui en a besoin.
  • Oh oui. J'ai également raccourci le nom de la ressource. Déposer la ‘_setup’.

Cette version abrégée est plus typique de la façon dont je commencerais à écrire mon code de test.

J'ajoute seulement des finaliseurs (démontage) si nécessaire pour la ressource.
Il est intéressant de noter que seul le dispositif de ressources doit se soucier du finaliseur.
Vous pouvez l'ajouter si vous en avez besoin, et les modifications nécessaires ne concernent que le code de l'appareil d'installation.

Je suis aussi généralement d'accord avec le niveau de fonction au début.
Je suis attentif aux temps d'exécution et à la détermination réaliste des ressources nécessaires, et je modifie la portée si nécessaire.
Et encore une fois, ce violon est isolé du code de la ressource.
Les tests ne doivent pas être modifiés pour prendre en charge différentes portées.

Alors, voici mon essai:

emballer

Mon objectif principal pour ce billet était de montrer que l’utilisation de fixtures pytest est au moins aussi simple que d'utiliser la solution de montage de classe pour séparer l'utilisation de montage.

J'espère l'avoir démontré.

Faites-le moi savoir si j'ai laissé quelques questions ouvertes.
Il y a beaucoup plus à couvrir, et j’ai un plan général pour aller de l’avant, mais j’aimerais beaucoup votre contribution.