概略
Visual Studio Code(vscode)で、pythonのユニットテストであるpytestを使う設定。
File Not Foundになったり、想定したよりもトラブルが発生したので、解決法をまとめる。
環境
- OS: macOS Monterey 12.4
- Docker: Docker Desktop 4.2.0
- DockerImage: python:3.9.13-slim-bullseye (builderはfull版。runnerはslim版。)
pytestのインストール
通常は、sudo pip install pytest
とすれば問題ない。
ただ、開発環境をDocker上に用意し、マルチステージビルドをしている場合の注意事項。
pytest, py.testが/usr/local/binに入ってしまうので、builderからrunnerへコピーしておく必要がある。
# /usr/local/bin/pytest, py.testをコピー COPY --from=builder /usr/local/bin/pytest /usr/local/bin/ COPY --from=builder /usr/local/bin/py.test /usr/local/bin/
pytest実行: CLIを使う場合
CLIでテストを実行する場合には、プロジェクトフォルダーに移動してからpytestを起動する。
cd [project/path] python -m pytest
移動したディレクトリを基点(ベースディレクトリ)として、テストが実行される。
pytest実行: vscodeを使う場合
vscodeを使ってテストを実行する場合はこちら。
- コマンドパレット(cmd+shift+p) を入力してから "Python: Configure Tests" を選択
- pytestを選択し、プロジェクトのパス名を選ぶ
- サイドバーにテスト用のアイコン(フラスコ)が表示される
- アイコンを選択して、矢印マークを押せばテストが実行される
テストが正常に実行されない場合
以下のような条件が満たされると、テストのときにエラーとなる。
これはvscodeで設定されるデフォルト値では、プロジェクトのディレクトリをpytestのtest対象のディレクトリとしてのみ認識するため。
カレントディレクトリはルートディレクトリのままなので、vscode上でのルートディレクトリがプロジェクトのディレクトリと不一致の場合には、ファイルを参照するプログラム部分でFileNotFoundが発生する。
暫定対処案
- プログラム内でルートディレクトリからのフルパスを記述すること。
ただし、この案だと、環境依存でプログラムを変更しないといけないため、なるべくやりたくない。
本対処
vscode側の設定を変更する。
- vscodeの設定画面を開く(cmd+,)
- pytestに関する設定だけを表示
- 設定する対象として、ワークスペースを指定(場合によってはリモートでもよい)
- "Python > Testing: cwd" の項目で、プロジェクトのディレクトリをルートディレクトリからのフルパスで指定
- "Python > Testing: Pytest Args" の項目で、入力されている内容を削除
"cwd"を設定すると、pytestでもそのディレクトリが--root_dirとして読み込まれている。
CLIでの実行のときに、わざわざプロジェクトのディレクトリへ"cd"してからpytestを実行していた。
pytestを実行したときのディレクトリを基点(ベースディレクトリ)として、テストが実行されるためであった。
この対処でも、"cwd" で基点を設定して、pytestを実行するようにしている。
NGだった対処
下記のように設定しても、NGだった。
これだとtestsフォルダからテストファイルを検出することには成功するが、ファイルの参照で失敗する。
"cwd"の設定で、こちらの--root_dirの設定もしてくれるので、"cwd"だけ設定を変更すれば良い。
まとめ
多少のトラブルはあったが、pytestによる単体テスト実行は非常に便利。
vscodeでは、ソースコードを変更するとsaveしたときに、テストを自動で実行することもできる。
バグの早期検出にも非常に役立ちそうである。
vscodeが悪いような書き方になってしまっているかもしれないが、そうではない。
ルートディレクトとプロジェクトディレクトリが不一致であることが問題なので、私の開発環境の要因が大きいと考えていることは、付記しておきたい。
私のフォルダ構成