【pytest】E ModuleNotFoundError: No module named 'src'

Pythonのモジュール解決周りは難解ですね・・・

  • Python 3.8.3
  • Poerty 1.1.4
  • pytest 6.1.2
$ poetry run pytest ./src ./tests
ImportError while importing test module 'project_dir/tests/foo/test_bar.py'.
Hint: make sure your test modules/packages have valid Python names.
# 省略
E   ModuleNotFoundError: No module named 'src'
project_dir
├ src
│  └ foo
│      └ bar.py
└ tests
    └ foo
        └ test_bar.py # ここでエラー
# project_dir/src/tests/foo/test_bar.py

from src.foo.bar import Bar

# 以下省略

この from src...src が見つけられないようです。

原因ですが、pytestはデフォルトで test* を満たすファイル名を探して実行しようとします。
そのため test* の名前のファイルが1つもない src 下をロードできていないのではないかと考えました。

解決策として、 src ディレクトリ直下に test* を満たす適当なファイルを作成します。
今回は test_init.py としました。
pytestにロードさえしてもらえれば良いのでファイルの中身は空です。

project_dir
├ src
│  ├ test_init.py # 空ファイルを追加
│  └ foo
│      └ bar.py
└ tests
    └ foo
        └ test_bar.py # ここでエラー

そうするとちゃんと src を読んでもらえるようになりました。