プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

VSCode で Python の unittest をデバッグ実行できない

こちらの記事で、 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 に

visual studio code - Unable to run python unittest in debug mode with reference to test folder in VSCODE - Stack Overflow

というのがありました。

なんでも、 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="./"

とりあえずご参考までに。