できない.dev

conftest.py

別名: conftest / conftest ファイル

pytest がディレクトリ単位で読み込むローカルプラグインのファイル。
ここに書いたフィクスチャは、同じディレクトリとその配下のテストから import せずに使える。

公開:

定義

conftest.py は、pytest がディレクトリごとに読み込むローカルプラグインのファイル。
ここで定義したフィクスチャは、そのディレクトリと配下のテストから import せずに使える。
フック関数を書けば、その範囲のテストにだけ収集や実行の振る舞いを足せる。

詳細

conftest.py は階層ごとに置ける。
下位の conftest.py のフィクスチャは上位のものに追加され、テストはフィクスチャを自分から上の方向にだけ探す。
最初に見つかったものが使われるため、近い階層で同名のフィクスチャを定義すれば上位のものを上書きできる(公式ドキュメント(新しいタブで開く))。
既定の import モード(prepend)では、conftest.py を読み込むために、パッケージの外ならそのディレクトリを、パッケージの中ならパッケージの親ディレクトリを sys.path に加える。

tests/
├── conftest.py        # tests/ 配下のすべてで使える
├── api/
│   └── test_api.py
└── db/
    ├── conftest.py    # db/ 配下だけで使える
    └── test_db.py

よくある誤解

  • 兄弟ディレクトリの conftest.py も見える: 見えない。tests/db/conftest.py のフィクスチャは tests/api/ のテストからは使えない。
  • テストから import して使う: フィクスチャは引数名で受け取るだけで import は要らない。
    パッケージ外の conftest.py は import conftest が別の同名ファイルと取り違えられるおそれがあり、公式は conftest.py から import しないことを勧めている。
  • どの import モードでも sys.path に入る: --import-mode=importlib では pytest は sys.path を一切変更しない。

関連

フィクスチャが見つからない例は fixture 'xxx' not found、自作モジュールを import できない例は テストから自作モジュールを import できない を参照。

この記事は役立ちましたか?