VSCodeでPytestを実行しようとした際、以下のエラーが発生。
テストコードが読み込めず、困ったことに。
Pytest Discovery Error
Error discovering pytest(see Output > Python)
解決策
結論としては、テスト対象のソースにimprotがうまくいっていないモジュールがあると発生するようなので、それを解消する。(対象パッケージをインストールする等)
また、各ディレクトリに__init__.py
が無い場合も発生します。
インストールしていないパッケージをimportしているとエラーが発生。
対象パッケージの定義を消すとエラーが消える。
どのパッケージでエラーとなっているか分からない場合は、上記画像赤枠のError discovering pytest(see Output > Python)
にカーソルを当てると、エラー対象のパッケージが確認できます。
対象パッケージのインストール、削除を行った後も事象が改善されず、エラー内容も変わらない場合は、vscodeのウィンドウを再読み込みすることでエラー内容が更新されます。
ウィンドウをの再読み込みを行うには、コマンドパレット(F1キー)でReload Window
を入力し、実行します。
他の原因としては、下記赤枠の__init__.py
が各階層にがないと、同様のエラーが発生します。
また、下記画像のようにPYTEST_DIRをベースディレクトリとする場合、PYTEST_DIR直下の__init__.pyは不要です。参考
これらのことに加え、私の場合はそもそもpytest --collect-only
コマンドが実行できない状態だったので、それもエラーの原因だったと思われます。
① pytest --collect-onlyは実行できるか?
pytest
はインストール済みであったものの、pytest --collect-only
の実行は上手くいかなかった。
$ pytest --collect-only
ERROR: usage: pytest [options] [file_or_dir] [file_or_dir] [...]
pytest: error: unrecognized arguments: --cov=. --cov-report=html:test/test_results --html=test/test_results/report.html --self-contained-html
そこで、次のコマンドを実行したところ動作するようになった。
※ 私の場合、次のpip
の設定に誤りがあったため、一度では動作しなかった。
そのため次の②の手順を実施。
$ pip install pytest-cov
$ pip install pytest-html
② pipの設定はあっているか?
上記を実施しても、始めは上手く動作しなかった。
そこで、使用してるpythonのバージョンと、pipのインストール先が同じでバージョンであることを確認しました。
i$ pyenv versions
system
* 3.8.6 (set by PYENV_VERSION environment variable)
$ python --version
Python 3.8.6
$ pip --version
pip 22.0.3 from /Library/Frameworks/Python.framework/Versions/3.9/bin/pip
pip
のインストール先が、Python3.9の方になってしまっていた。
以下コマンドを実行てpyenvで使用している3.8.6バージョンにインストールされるよう切り替える。
$ echo eval "$(pyenv init -)" >> ~/.bash_profile
$ source ~/.bash_profile
$ pip --version
pip 22.0.3 from /Users/user/.pyenv/versions/3.8.6/lib/python3.8/site-packages/pip (python 3.8)
これで、①が上手くいくようになりました。
③ 足りないパッケージをひたすらインストール
pytest --collect-only
コマンドを実行すると足りていないパッケージを教えてくれます。
それを参考にひたすら足りないパッケージをインストールします。
$ pytest --collect-only
・・・・・
_______ERROR collecting test/test_hoge1.py _______
ImportError while importing test module '/Users/...
・・・・・
E ModuleNotFoundError: No module named 'fastapi'
・・・・・
_______ERROR collecting test/test_hoge2.py _______
ImportError while importing test module '/Users/...
・・・・・
E ModuleNotFoundError: No module named 'retry'
_______ERROR collecting test/test_hoge2.py _______
ImportError while importing test module '/Users/...
・・・・・
E ModuleNotFoundError: No module named 'pysnmp'
$ pip install fastapi
$ pip install retry
$ pip install pysnmp
④ インストールしてもエラーになるモジュール
インストールしてもエラーになるモジュールがありました。
$ pytest --collect-only
・・・・・・・・・・・
================================
== short test summary info
===================================
ERROR test/test_hoge2.py -
src.error.XXX: (ValidationError(model='Hoge', errors=[{'loc'...
ERROR test/test_hoge3.py -
src.error..XXX: (ValidationError(model='Hoge, errors=[{'loc'......
!!!!!!!! Interrupted: 2 errors during collection !!!!!!!!!
こちらのパッケージについては、Dockerにログイン状態であるときにimprotができるような書き方がされていたため、エラーとなっていました。
VScodeにRemote Developmentの拡張機能を追加し、Dockerに接続した状態でテストの読み込みを行なったところ、事象は解消しました。