こちらの記事で、 2-3 木を実装した際に、 Python の unittest を使ったテストの実行についても触れました。
この記事内では触れてなかったのですが、 VSCode で unittest を実行できるようにすると、テスト時に、 VSCode 上でデバッグもできるようになっていました。
このアイコンでデバッグ実行できます。
が、久しぶりに触ってみると、なぜかデバッグができずに、
test_SweepLineMethod (unittest.loader._FailedTest.test_SweepLineMethod) ... ERROR ====================================================================== ERROR: test_SweepLineMethod (unittest.loader._FailedTest.test_SweepLineMethod) ---------------------------------------------------------------------- ImportError: Failed to import test module: test_SweepLineMethod Traceback (most recent call last): File "/home/mor/.pyenv/versions/3.11.4/lib/python3.11/unittest/loader.py", line 154, in loadTestsFromName module = __import__(module_name) ^^^^^^^^^^^^^^^^^^^^^^^ File "(プロジェクトのパス)/test/test_SweepLineMethod.py", line 3, in <module> from Point import Point ModuleNotFoundError: No module named 'Point'
のようなエラーが表示されるようになってしまってました。Point というのは自分で作成したモジュールになり、テスト用のファイルがあるフォルダの一つ上にあります。
不確かな記憶ですが、以前 unittest を試していた時(2023年6月~7月頃)はデバッグでも動かしていたはずなんですよね。
この問題(?)を解決するために、やったことをメモっておきます。
類似の現象
類似の現象がないか探してみると、 StackOverflow に
というのがありました。
なんでも、 VSCode 1.78.x の時は、テストが実行できていたけど、 1.80.x になったら上記のエラーが表示されるようになった、という内容のようです。状況としては似てますね。
解決策
StackOverflow の記事によると、 PYTHONPATH を指定すれば問題が解決するようです。早速試してみます。
VSCode のリファレンスを参考に、 launch.json を作成します。こにもあるように、 "purpose" を "debug-test" としておくと、テスト時に利用されるようです。
今回作った launch.json は下記のようになります。
{ // IntelliSense を使用して利用可能な属性を学べます。 // 既存の属性の説明をホバーして表示します。 // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "Python: Debug Tests", "type": "python", "request": "launch", "program": "${file}", "purpose": ["debug-test"], "console": "integratedTerminal", "justMyCode": false, "env": { "PYTHONPATH": "./" } } ] }
再テスト
上記の launch.json を作って、再度テストを実行すると、今度は import エラーなど出ずに、無事にブレークポイントで止まりました。
StackOverflow の記事だと、 .env ファイルと launch.json の両方に PYTHONPATH を設定するとあったのですが、手元の環境の場合は launch.json の設定のみで問題なく動作しました。
これで、問題なくデバッグできそうです。何かのご参考までに。
2024/6/7 追記
しばらく仕事が忙しくて、 Python 周りを触っていなかったんですが、久しぶりに触ったら、また同じようなエラーが出てました。こんどは、 VSCode の UI 上で、
のような感じになっており、テストケースが全然認識されていませんでした。で、『Show output』でエラーを確認すると、上記と同じく、 ModuleNotFoundError が出ていました。
どうも、久しぶりに VSCode を立ち上げた際にアップデートが走っていたので、その影響もあるのかもしれません(この時点で 1.90.0)。
結局、こうなった理由自体はよくわからなかったんですが、上記の StackOverflow の記事にあったように .env ファイルを作成して、 PYTHONPATH を定義したら、正しく認識するようになりました。
.env
# 2024/6/7 .env ファイルを追加 PYTHONPATH="./"
とりあえずご参考までに。