エラー内容
VSCodeのGUIからpytestを実行するとテスト対象モジュールのimportで失敗する。
解決方法
__init__.py
にパスを追加する。
目次
VSCodeのセットアップ
拡張機能としてPython Test Explorer for Visual Studio Codeを追加しておきます。
追加後はフラスコのアイコンが表示されます。
インストールが完了次第、ルートディレクトリを聞かれます。
今回はtest_project
をルートとます。
ディレクトリ構成と対象ファイル
test_project
├── src
│ └── main.py
└── tests
└── test_main.py
def add(a,b):
return a + b
from main import add
def test_add():
res = add(10,20)
assert res==30
__init__.py
でパスを追加する
import os
import sys
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'src')))
このコードは現在のファイルの親ディレクトリ(src ディレクトリ)をPythonのシステムパスに追加していて、具体的には以下のようなステップを踏んでいます。
-
__file__
は現在実行中のPythonファイルのフルパスを表します(/Users/yoshimasa/Desktop/test_project/tests/_init_.py) -
os.path.dirname() 関数は、与えられたパスのディレクトリ名を返します。これを用いて、現在のファイルが存在するディレクトリを取得します。
(/Users/yoshimasa/Desktop/test_project/tests) -
その後、'..'と'src'を連結します。
(/Users/yoshimasa/Desktop/test_project/tests/../src) -
さらに
os.path.abspath()
でパスを正規化します
(/Users/yoshimasa/Desktop/test_project/src)
最後に、sys.path.append() を使用して、この src ディレクトリをPythonのシステムパスに追加します。これにより、このディレクトリ内のモジュールやパッケージを、他の場所からインポートして使用できるようになります
poetryからテスト実行する場合
poetryでプロジェクを管理していて、コマンドライン(poetry run pytest)からテスト実行する場合はpoetry.tomlに以下を追記して対応するもよし。
[tool.pytest.ini_options]
addopts = [
"--import-mode=importlib",
]