2022.02.10   2022.02.27

【VSCode】Pytest Discovery Error : Error discovering pytest

Python    

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に接続した状態でテストの読み込みを行なったところ、事象は解消しました。

コメント
現在コメントはありません。
コメントする
コメント入力

名前 (※ 必須)

メールアドレス (※ 必須 画面には表示されません)

送信