2018/06/29

PyCharm でユニットテストを実行しようとすると ImportError が出てしまう場合、原因はシンボリックリンクの可能性あり

@PyCharm 2018.1.4 (Community Edition) on Ubuntu 16.04 64bit

PyCharm はユニットテストファイルを自動的に認識してコンテキストメニューを変化させてくれます。

例えば以下のように main_test.py を作成したとして1

右クリック → Run 'Unittests in main_te...'

とすると、ユニットテスト用の Configuration が作成され、テストが実行されます。

実行結果はこんな感じ。

パスにシンボリックリンクを含んでいると失敗する

ところが、このユニットテスト、プロジェクトパスにシンボリックリンクが含まれていると失敗してしまいます。

例えば、以下のようにシンボリックリンクでプロジェクトが指定されているとします。

$ ln -s untitled Project/untitled

Project/untitled プロジェクトを PyCharm で開いて、先ほどと同じように実行すると、 以下のように ImportError が発生してしまうのです。

Ran 1 test in 0.001s

FAILED (errors=1)
Launching unittests with arguments python -m unittest /home/yusuke/Projects/untitled/tests/main_test.py in /home/yusuke/untitled/tests

Error
Traceback (most recent call last):
  File "/usr/lib/python3.5/unittest/case.py", line 58, in testPartExecutor
    yield
  File "/usr/lib/python3.5/unittest/case.py", line 600, in run
    testMethod()
  File "/usr/lib/python3.5/unittest/loader.py", line 34, in testFailure
    raise self._exception
ImportError: Failed to import test module: /home/yusuke/Projects/untitled/tests/main_test
Traceback (most recent call last):
  File "/usr/lib/python3.5/unittest/loader.py", line 153, in loadTestsFromName
    module = __import__(module_name)
ImportError: No module named '/home/yusuke/Projects/untitled/tests/main_test'

今回はプロジェクトのルートディレクトリをシンボリックリンクにしましたが、パスにシンボリックリンクを含んでいる場合は全て失敗するようです。

回避策1

プロジェクトパスにシンボリックリンクを含めないのが一番ですが、それが出来ない場合2は Run/Debug Configurations を編集することで対処可能です。

Edit Configurations...

Target を Module name に変更し、main_test のように指定します。

なお、ディクトリ構造の場合は tests.main_test の用にピリオドでモジュール指定します。

回避策2

Target を実ファイルの存在するパスに書き換えても大丈夫です。

これが出来るなら最初からシンボリックリンクを含まないパスでプロジェクトを開いておけって話ですけど。

  1. ディレクトリ構造がフラットとか、プロジェクト名が…とか気にしないこと 
  2. 出来ないというより、面倒くさい場合かな? 
?

0 件のコメント: