J'ai découvert récemment pytest
. Ça a l'air génial. Cependant, je pense que la documentation pourrait être meilleure.
J'essaie de comprendre à quoi conftest.py
servent les fichiers.
Dans ma suite de tests (actuellement petite), j'ai un conftest.py
fichier à la racine du projet. Je l'utilise pour définir les fixations que j'injecte dans mes tests.
J'ai deux questions:
- Est-ce la bonne utilisation de
conftest.py
? A-t-il d'autres utilisations? - Puis-je avoir plus d'un
conftest.py
fichier? Quand voudrais-je faire ça? Des exemples seront appréciés.
Plus généralement, comment définiriez-vous le but et l'utilisation correcte des conftest.py
fichiers dans une suite de tests py.test?
It seems great. However, I feel the documentation could be better.
conftest.py
et bien qu'il existe de nombreuses références à faire cette chose ou à faire cette chose avec un fichier conftest, nulle part dans la documentation cela n'indique jamais que lorsque pytest teste la découverte, tous les fichiers conftest.py trouvés (dans le le répertoire strucutre sur lequel la découverte de test est effectuée) sera exécuté pendant la phase de collecte des tests (avant l'exécution des tests). J'ai dû comprendre cela moi-même par l'expérimentation.Réponses:
Oui, ça l'est. Les luminaires sont une utilisation potentielle et courante de
conftest.py
. Les fixtures que vous définirez seront partagées entre tous les tests de votre suite de tests. Cependant, la définition de fixtures à la racineconftest.py
peut être inutile et ralentirait les tests si ces fixtures n'étaient pas utilisées par tous les tests.Oui.
Fixtures : définissez les fixtures pour les données statiques utilisées par les tests. Ces données sont accessibles par tous les tests de la suite, sauf indication contraire. Cela pourrait être des données ainsi que des aides de modules qui seront transmises à tous les tests.
Chargement de plugins externes :
conftest.py
permet d'importer des plugins ou modules externes. En définissant la variable globale suivante, pytest chargera le module et le rendra disponible pour son test. Les plugins sont généralement des fichiers définis dans votre projet ou d'autres modules qui pourraient être nécessaires dans vos tests. Vous pouvez également charger un ensemble de plugins prédéfinis comme expliqué ici .pytest_plugins = "someapp.someplugin"
Crochets : vous pouvez spécifier des crochets tels que les méthodes de configuration et de démontage et bien plus encore pour améliorer vos tests. Pour un ensemble de crochets disponibles, lisez ici . Exemple:
Tester le chemin racine : c'est un peu une fonction cachée. En définissant
conftest.py
dans votre chemin racine, vous aurezpytest
reconnaître vos modules d'application sans spécifierPYTHONPATH
. En arrière-plan, py.test modifie votresys.path
en incluant tous les sous-modules trouvés depuis le chemin racine.Oui, vous le pouvez et il est fortement recommandé si votre structure de test est quelque peu complexe.
conftest.py
les fichiers ont une portée de répertoire. Par conséquent, la création d'appareils et d'aides ciblés est une bonne pratique.Plusieurs cas pourraient convenir:
Création d'un ensemble d'outils ou de crochets pour un groupe particulier de tests.
root / mod / conftest.py
Chargement d'un ensemble d' appareils pour certains tests mais pas pour d'autres.
root / mod / conftest.py
root / mod2 / conftest.py
root / mod2 / test.py
Imprime "quelques autres trucs".
Remplacer les crochets hérités de la racine
conftest.py
.root / mod / conftest.py
root / conftest.py
En exécutant un test à l'intérieur
root/mod
, seul "I am mod" est imprimé.Vous pouvez en savoir plus
conftest.py
ici .ÉDITER:
Vous pouvez utiliser
conftest.py
pour définir vos assistants. Cependant, vous devez suivre la pratique courante. Les assistants peuvent être utilisés comme appareils au moins danspytest
. Par exemple, dans mes tests, j'ai un simulateur d'aide redis que j'injecte dans mes tests de cette façon.root / helper / redis / redis.py
root / tests / stuff / conftest.py
root / tests / stuff / test.py
Ce sera un module de test que vous pourrez importer librement dans vos tests. NOTEZ que vous pourriez potentiellement nommer
redis.py
commeconftest.py
si votre moduleredis
contient plus de tests. Cependant, cette pratique est découragée en raison de l'ambiguïté.Si vous souhaitez l'utiliser
conftest.py
, vous pouvez simplement mettre cet assistant dans votre racineconftest.py
et l'injecter en cas de besoin.root / tests / conftest.py
root / tests / stuff / test.py
Une autre chose que vous pouvez faire est d'écrire un plugin installable. Dans ce cas, votre assistant peut être écrit n'importe où, mais il doit définir un point d'entrée à installer dans votre et les autres cadres de test potentiels. Voir ça .
Si vous ne souhaitez pas utiliser de fixtures, vous pouvez bien sûr définir un assistant simple et utiliser simplement la vieille importation partout où cela est nécessaire.
root / tests / helper / redis.py
root / tests / stuff / test.py
Cependant, ici, vous pourriez avoir des problèmes avec le chemin, car le module ne se trouve pas dans un dossier enfant du test. Vous devriez pouvoir surmonter cela (non testé) en ajoutant un
__init__.py
à votre assistantroot / tests / helper / __ init__.py
Ou ajoutez simplement le module d'assistance à votre
PYTHONPATH
.la source
test_aaaaa.py
tente réellement de s'exécuter avant que la configuration de l'appareil ne se termineconftest.py
. Avez-vous une idée de la raison pour laquelle cela peut se produire?Au sens large, conftest.py est un plugin local par répertoire. Vous définissez ici les crochets et les accessoires spécifiques au répertoire. Dans mon cas, j'ai un répertoire racine contenant des répertoires de tests spécifiques au projet. Une magie commune est placée dans conftest.py «racine». Spécifique au projet - dans les leurs. Je ne vois rien de mal à stocker des appareils dans conftest.py à moins qu'ils ne soient pas largement utilisés (dans ce cas, je préfère les définir directement dans les fichiers de test)
la source
Oui , un appareil est généralement utilisé pour préparer les données pour plusieurs tests.
Oui , un appareil est une fonction qui est exécutée
pytest
avant et parfois après les fonctions de test réelles. Le code dans le luminaire peut faire ce que vous voulez. Par exemple, un appareil peut être utilisé pour obtenir un ensemble de données sur lequel les tests doivent fonctionner, ou un appareil peut également être utilisé pour mettre un système dans un état connu avant d'exécuter un test.Tout d'abord, il est possible de placer les appareils dans des fichiers de test individuels. Cependant, pour partager des appareils entre plusieurs fichiers de test, vous devez utiliser un
conftest.py
fichier quelque part situé au centre pour tous les tests. Les appareils peuvent être partagés par n'importe quel test. Ils peuvent être placés dans des fichiers de test individuels si vous souhaitez que l'appareil ne soit utilisé que par des tests dans ce fichier.Deuxièmement, oui , vous pouvez avoir d'autres
conftest.py
fichiers dans les sous-répertoires du répertoire de tests supérieur. Si vous le faites, les appareils définis dans ces niveaux inférieursconftest.py
fichiers de seront disponibles pour les tests dans ce répertoire et ces sous-répertoires.Enfin, placer les appareils dans le
conftest.py
fichier à la racine du test les rendra disponibles dans tous les fichiers de test.la source