web-dev-qa-db-fra.com

Échec de découverte de test lorsque les tests dans différents répertoires sont appelés les mêmes

En utilisant py.test, deux tests appelés les mêmes dans des répertoires différents entraînent l'échec de py.test. Pourquoi donc? Comment puis-je changer cela sans renommer tous les tests?

Pour dupliquer, procédez comme suit:

; cd /var/tmp/my_test_module
; mkdir -p ook/test           
; mkdir -p eek/test
; touch ook/test/test_proxy.py
; touch eek/test/test_proxy.py
; py.test
============================= test session starts ==============================
platform linux2 -- Python 2.7.3 -- pytest-2.2.4
collected 0 items / 1 errors 

==================================== ERRORS ====================================
___________________ ERROR collecting ook/test/test_proxy.py ____________________
import file mismatch:
imported module 'test_proxy' has this __file__ attribute:
  /home/ygolanski/code/junk/python/mymodule/eek/test/test_proxy.py
which is not the same as the test file we want to collect:
  /home/ygolanski/code/junk/python/mymodule/ook/test/test_proxy.py
HINT: remove __pycache__ / .pyc files and/or use a unique basename for your test file modules
=========================== 1 error in 0.01 seconds ============================
61
Sardathrion

Mettre un __init__.py est un moyen de résoudre le conflit. Contrairement à nose, le pytest actuel n'essaye pas de décharger les modules de test afin d'importer des modules de test avec le même nom d'importation. J'avais l'habitude de penser que c'était un peu magique de faire cette désimportation automatique et que cela pouvait gâcher les attentes des gens quant à ce que fait le mécanisme d'importation; parfois, les gens comptent sur l'état global d'un module de test et avec le déchargement automatique, vous le perdez (un module de test importé d'un autre module de test peut alors faire des choses inattendues). Mais ce n'est peut-être pas un problème pratique et donc pytest pourrait ajouter un hack similaire ...

48
hpk42

Il s'agit d'une fonctionnalité réelle de py.test. Vous pouvez trouver la raison de ce comportement dans pytest.org - Bonnes pratiques d'intégration - Choix d'une disposition de test/règles d'importation :

  • éviter __init__.py fichiers dans vos répertoires de test. De cette façon, vos tests peuvent s'exécuter facilement sur une version installée de mypkg, indépendamment du fait que le package installé contienne ou non les tests.

Comme c'est le workflow recommandé de travailler avec py.test: installez le paquet en cours de développement avec pip install -e, puis testez-le.

Pour cette raison, j'opte moi-même pour des noms de test uniques, selon la convention plutôt que la configuration. Il garantit également que vous n'obtenez pas de noms de test ambigus dans les différentes sorties de test.

Si vous devez conserver les noms des tests et ne vous souciez pas des fonctionnalités mentionnées ci-dessus, vous devriez accepter de mettre un __init__.py.

23
famousgarkin

J'ai eu la même erreur, mais la solution n'avait rien à voir avec les fichiers d'initialisation ni le nom sur les fichiers de test. J'avais différent python sur mon macbook et sur mon Docker conteneur. J'ai lancé les tests une fois dans le bash du macbook à la racine du projet, au lieu du bash du conteneur.

La solution était de supprimer les fichiers mal créés en exécutant (depuis le bash du conteneur):

find -name '*.pyc' -delete
find -name __pycache__ -delete

Ensuite, relancez le test (toujours depuis le bash du conteneur) et tout a bien fonctionné:

py.test
7
Léo Chaz Maltrait