Je suis python unittest pour faire un test et utiliser la fonction de découverte pour emballer les tests dans une suite. Cependant, lorsque j'essaie d'exécuter le test avec unittest, j'obtiens cette erreur:
Traceback (most recent call last):
File "D:/Project/run_tests.py", line 12, in <module>
suite2 = unittest.defaultTestLoader.discover(dir2, pattern='test*.py')
File "C:\Python\Python36-32\lib\unittest\loader.py", line 338, in discover
raise ImportError('Start directory is not importable: %r' % start_dir)
ImportError: Start directory is not importable: 'D:\\Project\\dir2'
Voici à quoi ressemble run_tests.py:
import unittest
if __name__ == "__main__":
dir1 = "./test1"
suite1 = unittest.defaultTestLoader.discover(dir1, pattern='test*.py')
runner1 = unittest.TextTestRunner()
runner1.run(suite1)
dir2 = "./tes2"
suite2 = unittest.defaultTestLoader.discover(dir2, pattern='test*.py')
runner2 = unittest.TextTestRunner()
runner2.run(suite2)
Eu une erreur très similaire, mais aucun lien symbolique n'implique.
Ceci est ma disposition de répertoire.
- project root
- foo
- bar
- test
foo et bar sont considérés comme des packages de haut niveau, où test est tous les cas de test en direct.
Lors de l'exécution de unittest dans intellij, j'ai utilisé les paramètres suivants:
test
Cette configuration m'a donné le Start directory is not importable
Erreur.
J'ai tracé la source dans unittest.loader.py et je me rends compte qu'il vérifie le dossier de test pour __init__.py
. La solution consiste donc à ajouter un __init__.py
dans mon dossier test
. J'espère que cela aide quelqu'un.
-- Éditer --
Je suis sur python 3.6, mac osx
J'ai eu un problème de test très similaire sur CI Pipeline. Dans mon cas, il y avait un niveau de dossier d'indirection/topleveldirectory/tests
j'ai donc ajouté -s à ma commande la plus simple:
python -m unittest discover -s folder/topleveldirectory/tests
Il y a une question similaire avec une réponse utile ici .
Cependant, cela peut se produire si vous utilisez un IDE comme PyCharm sous Linux et que vous ouvrez des fichiers dans un répertoire soft-linked . Il semble que l'éditeur qui exécute le tests confond les deux chemins vers le même module et dit qu'il n'en existe pas.
Ce problème me revient toujours régulièrement dans mes projets python utilisant PyCharm/IntelliJ. J'ai donc dû combiner les deux conseils ci-dessus pour le faire fonctionner sur ma plate-forme (généralement Linux). il et en cours d'exécution avec les étapes suivantes:
__init__.py
dans mon répertoire de tests unitaires.Lors de la référence à un répertoire lié symboliquement, l'erreur suivante s'est produite lors de la tentative d'exécution des tests unitaires:
Traceback (dernier appel le plus récent): Fichier "/home/z003yb2k/.IntelliJIdea2019.2/config/plugins/python/helpers/pycharm/_jb_unittest_runner.py", ligne 35, dans main (argv = args, module = None, testRunner = unittestpy.TeamcityTestRunner, buffer = not JB_DISABLE_BUFFERING) File "/usr/lib/python3.7/unittest/main.py", ligne 100 , dans __init __ self.parseArgs (argv) Fichier "/usr/lib/python3.7/unittest/main.py", ligne 124, dans parseArgs self._do_discovery (argv [2:]) Fichier "/usr/lib/python3.7/unittest/main.py", ligne 244, dans _do_discovery self.createTests (from_discovery = True, Loader = Loader) Fichier "/usr/lib/python3.7/unittest/main.py", ligne 154, dans createTests Self.test = loader.discover (self.start, self.pattern , self.top) Fichier "/usr/lib/python3.7/unittest/loader.py", ligne 349, dans la découverte tests = list (self._find_tests (start_dir, pattern) ) Fichier "/usr/lib/python3.7/unittest/loader.py", ligne 387, dans _find_tests Name = self._get_name_from_path (start_dir) File "/ usr/lib/python3.7/unittest/loader.py ", ligne 371, dans _get_name_from_path assert not _relpath.startswith ('..')," Path must be within the project " AssertionError: Path must faire partie du projet