In py.test, à quoi sert conftest.py des dossiers?

j'ai récemment découvert pytest . Il semble grand. Cependant, je pense que la documentation pourrait être meilleure.

j'essaie de comprendre à quoi servent les fichiers conftest.py .

dans ma suite de test (actuellement petite) j'ai un fichier conftest.py à la racine du projet. Je l'utilise pour définir les fixtures que j'injecte dans mes tests.

j'ai deux questions:

  1. est-ce le l'utilisation correcte de conftest.py ? A-t-elle d'autres utilisations?
  2. puis-je avoir plus d'un fichier conftest.py ? Quand aurais-je envie de faire? Des exemples seront appréciés.

de façon plus générale, Comment définiriez-vous l'objet et l'utilisation correcte des fichiers conftest.py dans un ap.test de la suite de tests?

101
demandé sur lmiguelvargasf 2015-12-25 23:08:20

3 réponses

est-ce l'usage correct de conftest.py Je ne sais pas.

Oui, Les Fixtures sont une utilisation potentielle et courante de conftest.py . Le les fixtures que vous définirez seront partagées entre tous les tests de votre suite de tests. Cependant, définir des fixtures dans la racine conftest.py pourrait être inutile et cela ralentirait les tests si de telles fixtures ne sont pas utilisées par tous les tests.

a-t-il d'autres utilisations?

Oui.

  • Fixtures : définir les fixtures pour les données statiques utilisées par les tests. Ces données peuvent être consultées par tous les tests de la suite, sauf indication contraire. Il peut s'agir de données ainsi que d'aides de modules qui seront passées à tous les tests.

  • Externe chargement des plugins : conftest.py est utilisé pour importer des plugins ou modules externes. En définissant la variable globale suivante, pytest chargera le module et le mettra à disposition pour son essai. 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 à partir de ici .

    pytest_plugins = "someapp.someplugin"

  • Hooks : vous pouvez Des crochets spécifiés tels que setup et méthodes de démontage et beaucoup plus pour améliorer vos tests. Pour un jeu de crochets disponibles, lire ici . Exemple:

    def pytest_runtest_setup(item):
         """ called before ``pytest_runtest_call(item). """
         #do some stuff`
    
  • Test du chemin de la racine : C'est un peu une fonctionnalité cachée. En définissant conftest.py dans votre chemin racine, vous aurez pytest qui reconnaîtra vos modules d'application sans spécifier PYTHONPATH . Sur le fond, py.test modifie votre sys.path par y compris tous les submodules qui sont trouvés sur le chemin de la racine.

puis-je en avoir plus d'un conftest.py un dossier?

Oui vous pouvez et il est fortement recommandé si votre structure d'essai est en quelque sorte complexe. conftest.py les fichiers ont une portée de répertoire, donc créer des fixtures et des helpers ciblés est une bonne pratique.

quand voudrais-je faire ça? Des exemples seront appréciés.

plusieurs cas pourraient convenir:

créant un jeu d'outils ou crochets pour un groupe d'essais particulier

root/mod/conftest.py

def pytest_runtest_setup(item):
    print("I am mod")
    #do some stuff


test root/mod2/test.py will NOT produce "I am mod"

charger un jeu de fixtures pour certains essais mais pas pour d'autres.

root/mod/conftest.py

@pytest.fixture()
def fixture():
    return "some stuff"

root/mod2/conftest.py

@pytest.fixture()
def fixture():
    return "some other stuff"

root/mod2/test.py

def test(fixture):
    print(fixture)

imprime "autre chose "

Remplacer crochets hérité de la racine conftest.py

root/mod/conftest.py

def pytest_runtest_setup(item):
    print("I am mod")
    #do some stuff

root/conftest.py

def pytest_runtest_setup(item):
    print("I am root")
    #do some stuff

en exécutant n'importe quel test à l'intérieur de root/mod , seulement" je suis mod " est imprimé.

vous pouvez en savoir plus sur conftest.py ici .

EDIT:

que se passe-t-il si j'ai besoin de fonctions simples d'aide pour être appelé à partir d'un numéro des essais en différents moduls-seront-ils être disponible pour moi si je mets dans un conftest.py? Ou devrais-je simplement les mettre dans un helpers.py module et l'importer et l'utiliser dans mes modules de test?

Vous pouvez utiliser conftest.py pour définir vos aides, cependant, vous devez suivre la pratique courante. les helpers peuvent être utilisés comme fixtures au moins dans py.test . Par exemple, dans mes tests, j'ai un assistant redis moqué que j'injecte dans mes tests de cette façon.

root/helper/redis/redis.py

@pytest.fixture
def mock_redis():
    return MockRedis()

root/tests/stuff/conftest.py

pytest_plugin="helper.redis.redis"

root/tests/stuff/test.py

def test(mock_redis):
    print(mock_redis.get('stuff'))

ce sera un module de test que vous pouvez librement importer dans vos tests. NOTE que vous pourriez éventuellement nommer redis.py comme conftest.py si votre module redis contient plus test. Toutefois, cette pratique est découragée en raison de l'ambiguïté.

si vous voulez utiliser conftest.py simplement, vous pouvez mettre ce helper dans votre racine conftest.py et l'injecter en cas de besoin.

root/tests/conftest.py

@pytest.fixture
def mock_redis():
    return MockRedis()

root/tests/stuff/test.py

def test(mock_redis):
    print(mock_redis.get(stuff))

une Autre chose que vous pouvez faire est d'écrire un " plugin. Dans dans ce cas, votre helper peut être écrit n'importe où mais il doit définir un point d'entrée à installer dans votre et d'autres cadres de test potentiels. Voir ce .

si vous ne voulez pas utiliser les fixtures, vous pouvez bien sûr définir un helper simple et juste utiliser le simple Vieux import où il est nécessaire.

root/tests/helper/redis.py

class MockRedis():
    # stuff

root/tests/stuff/test.py

from helper.redis import MockRedis

def test():
    print(MockRedis().get(stuff))

cependant ici vous pourriez avoir des problèmes avec le chemin puisque le module n'est pas dans un dossier enfant du test. Vous devriez être en mesure de surmonter cela (non testé) en ajoutant un init à votre helper

root/tests/helper/__init__.py

from .redis import MockRedis

ou tout simplement en ajoutant le module helper à votre PYTHONPATH .

141
répondu Simone Zandara 2016-09-13 16:05:06

au sens large conftest.py est un plugin local par répertoire. Ici vous définissez les crochets et fixtures spécifiques aux répertoires. Dans mon cas, un répertoire racine contient des répertoires de tests spécifiques au projet. Une certaine magie commune est placée dans "root" conftest.py. Projet spécifique - dans leurs propres. Je ne vois rien de mal à stocker des appareils dans conftest.py sauf s'ils ne sont pas largement utilisés (dans ce cas, je préfère les définir directement dans les fichiers de test)

7
répondu Furious Duck 2015-12-28 12:55:37

j'utilise le fichier conftest.py pour définir les fixtures que j'injecte dans mes tests, est-ce la bonne utilisation de conftest.py ?

Oui , un appareil est habituellement utilisé pour préparer des données pour des tests multiples.

a-t-il d'autres utilisations?

Oui , un appareil est une fonction qui est exécutée par pytest avant, et parfois après, les fonctions de test réelles. Le code dans l'appareil peut faire tout ce que vous le souhaitez. Par exemple, un appareil peut être utilisé pour obtenir un ensemble de données pour les tests de travailler sur, ou un appareil peut également être utilisé pour obtenir un système dans un état connu avant l'exécution d'un test.

puis-je avoir plus d'un fichier conftest.py ? Quand aurais-je envie de faire?

tout D'abord, il est possible de mettre des fixtures dans le test individuel fichier. Cependant, pour partager des fixtures parmi plusieurs fichiers de test, vous devez utiliser un fichier conftest.py quelque part au centre pour tous les tests. Les luminaires peuvent être partagées par toute épreuve. Ils peuvent être placés dans des fichiers de test individuels si vous voulez que le montage ne soit utilisé que par des tests dans ce fichier.

Second, yes , vous pouvez avoir d'autres fichiers conftest.py dans les sous-répertoires du répertoire TOP tests. Si vous le faites, luminaires définis dans ces bas-niveau Les fichiers conftest.py seront disponibles pour les tests dans ce répertoire et ses sous-répertoires.

enfin, mettre les fixtures dans le fichier conftest.py à la racine du test les rendra disponibles dans tous les fichiers de test.

3
répondu lmiguelvargasf 2018-08-07 03:47:05