web-dev-qa-db-ja.com

python-unittest-ImportError:開始ディレクトリはインポートできません

python unittestを実行してテストを行い、discover関数を使用してテストをスイートにパックします。ただし、unittestでテストを実行しようとすると、次のエラーが発生します。

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'

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

非常によく似たエラーがありましたが、シンボリックリンクは関係していません。

これは私のディレクトリレイアウトです。

- project root
  - foo
  - bar
  - test

fooとbarは最上位のパッケージと見なされ、testはすべてのテストケースをライブで実行します。

Intellijでunittestを実行するとき、次のパラメーターを使用しました。

  • ターゲット:testフォルダーに設定されたスクリプトパス
  • 作業ディレクトリはプロジェクトのルートです。

この設定でStart directory is not importableエラーが発生しました。

私はunittest.loader.pyでソースをトレースしましたが、__init__.pyのテストフォルダーをチェックしていることに気付きました。したがって、解決策はtestフォルダに__init__.pyを追加することです。これが誰かを助けることを願っています。

-編集-

python 3.6、mac osx

8
Douglas Liu

CIパイプラインで非常によく似た問題テストを行いました。私の場合、間接フォルダ/トップレベルディレクトリ/テストのレベルがありました

だから私は私のユニットテストコマンドに-sを追加しました:

python -m unittest discover -s folder/topleveldirectory/tests

3
joh-mue

ここに役立つ答えがある同様の質問 があります。

ただし、これは、LinuxでPyCharmのようにIDEを使用していて、ファイルを soft-linked ディレクトリで開いている場合に発生する可能性があります。テストは、同じモジュールへの2つのパスについて混乱し、1つは存在しないと言います。ソフトリンクなしですべてを1つの場所に配置すると、これが修正されます。

3
James Bradbury

その問題は常にpython PyCharm/IntelliJを使用するプロジェクトで定期的に発生します。そのため、プラットフォーム(通常はLinux)で実行するには、上記の両方のヒントを組み合わせる必要がありました。次の手順で実行します。

  1. 単体テストディレクトリに空の___init__.py_を作成します。
  2. PyCharmがネイティブディレクトリで動作するように、シンボリックリンクされたディレクトリのオリジンを参照してください。
  3. ユニットテストディレクトリをPyCharmでTest Sources Rootとしてマークします。
  4. 参照されたPythonユニットテストで使用されるコードをSources Rootとしてマークします

シンボリックリンクされたディレクトリを参照するときに、単体テストを実行しようとしたときに次のエラーが発生しました。

トレースバック(最新の呼び出しは最後):
ファイル "/home/z003yb2k/.IntelliJIdea2019.2/config/plugins/python/helpers/pycharm/_jb_unittest_runner.py"、35行目、
 main(argv = args、module = None、testRunner = unittestpy.TeamcityTestRunner、buffer = not JB_DISABLE_BUFFERING)
ファイル "/usr/lib/python3.7/unittest/main.py"、行100 、__ init __ 
 self.parseArgs(argv)
ファイル「/usr/lib/python3.7/unittest/main.py」の124行目、parseArgs 
 self._do_discovery内(argv [2:])
 _do_discovery 
内のファイル "/usr/lib/python3.7/unittest/main.py"、244行目、self.createTests(from_discovery = True、Loader = Loader)
 createTests 
内のファイル "/usr/lib/python3.7/unittest/main.py"、154行目、self.test = loader.discover(self.start、self.pattern 、self.top)
 discover 
のファイル「/usr/lib/python3.7/unittest/loader.py」、349行、tests = list(self._find_tests(start_dir、pattern) )
ファイル "/usr/lib/python3.7/unittest/loader.py"、387行、_find_tests 
 name = self._get_name_from_path(start_dir)
ファイル"/usr/lib/python3.7/unittest/loader.py "、371行目、_get_name_from_path 
でアサートしない_relpath.startswith( '..')をアサートしない、「パスはプロジェクト内にある必要がある」
 AssertionError:パスが必要プロジェクト内にいる
 
0
André Müller