Python で,コードカバレッジとか取りたいという関係でテストモジュールを直接実行することがあるんですけど,別ディレクトリのテストモジュールだと import sys; sys.path.append('.') を書かないといけないのどうにかなりません?
— うたがわきき🔰💊 (@utgwkk) 2017年8月27日
普段は nosetests とか使っているので回避しているけど,たとえばコードカバレッジを取りたいので coverage run test/test_hoge.py
を実行する,といったときに困る.
古典的な対処法として,テストの先頭*1に,
import sys sys.path.append('.')
と書けば,カレントディレクトリのモジュールを import 対象に含めてくれるけど,こうすると PEP8 の
Imports are always put at the top of the file, just after any module comments and docstrings, and before module globals and constants.
という一文に反してしまう(し,実際 pycodestyle
にかけたときに怒られる).どうすればいいのか調べてみたところ次の Stack Overflow の解答に出くわした.
テストモジュールのディレクトリに,
import sys sys.path.append('.')
を行うモジュールを配置し,それぞれのテストでそのモジュールを import してやれば解決した.
*1:正確には,テスト対象のモジュールを import する前.