2018/06/29

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

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

[PyCharm](https://www.jetbrains.com/pycharm/) はユニットテストファイルを自動的に認識してコンテキストメニューを変化させてくれます。

例えば以下のように `main_test.py` を作成したとしてディレクトリ構造がフラットとか、プロジェクト名が…とか気にしないこと、

右クリック → Run 'Unittests in main_te...'
とすると、ユニットテスト用の Configuration が作成され、テストが実行されます。 実行結果はこんな感じ。
### パスにシンボリックリンクを含んでいると失敗する ところが、このユニットテスト、プロジェクトパスにシンボリックリンクが含まれていると失敗してしまいます。 例えば、以下のようにシンボリックリンクでプロジェクトが指定されているとします。 ```console `gutter: false; $ 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 プロジェクトパスにシンボリックリンクを含めないのが一番ですが、それが出来ない場合出来ないというより、面倒くさい場合かな?は Run/Debug Configurations を編集することで対処可能です。 Edit Configurations...
Target を `Module name` に変更し、`main_test` のように指定します。
なお、ディクトリ構造の場合は `tests.main_test` の用にピリオドでモジュール指定します。 ### 回避策2 Target を実ファイルの存在するパスに書き換えても大丈夫です。
これが出来るなら最初からシンボリックリンクを含まないパスでプロジェクトを開いておけって話ですけど。

0 件のコメント: