web-dev-qa-db-fra.com

python - unittest - ImportError: le répertoire de démarrage n'est pas importable

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)
9
frank.hsueh

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:

  • Cible: chemin du script défini dans le dossier test
  • Le travail directoy est la racine du projet.

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

8
Douglas Liu

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

3
joh-mue

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.

3
James Bradbury

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:

  1. Créez un __init__.py dans mon répertoire de tests unitaires.
  2. Reportez-vous à l'origine du répertoire lié symboliquement de telle sorte que PyCharm travaille uniquement sur le répertoire natif.
  3. Marquez le répertoire des tests unitaires comme racine des sources de test dans PyCharm.
  4. Marquez les codes Python utilisés par les tests unitaires comme Racine des sources

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 
 
0
André Müller