MENU

pytestとは|Python事実上標準のテストフレームワーク

pytest アイキャッチ
pytest

pytestは2004年頃にHolger KrekelがPyPy開発の文脈で立ち上げたPython向けテストフレームワークで、現在ではPythonのテストにおける事実上の標準として位置づけられている。標準ライブラリのunittestより簡潔な記述、強力なfixture機構、豊富なプラグイン群を持ち、DjangoやFastAPI、機械学習プロジェクトなど領域を問わず採用されている。本稿ではpytestの歴史と中核機能、fixtureやパラメータ化、プラグイン文化までを順に整理する。

目次

この記事の目次

  1. pytestの歴史と設計思想
  2. fixtureとパラメータ化
  3. プラグインとカバレッジ計測
  4. unittestや他言語との比較
  5. まとめ

pytestの歴史と設計思想

pytestの歴史と設計思想

pytestのルーツは2003年頃に始まったPyPyプロジェクトの社内テストツールであり、Holger Krekelが当初py.testの名前で公開した。2004年に独立したパッケージとして配布が始まり、以降Floris Bruynooghe、Ronny Pfannschmidtら多数のコントリビュータが加わって発展してきた。2018年にバージョン4.0、2020年にバージョン6.0、2023年には7.0系がリリースされ、現在も活発に開発が続いている。

設計の柱は「シンプルな関数で書ける」「アサーションはassert文だけ」「fixtureで構造化する」という三点である。unittestのようにクラス継承を強制せず、テスト関数として書けば自動収集する。assert文の失敗時にはpytestがバイトコードを解析して詳細な比較情報を表示するため、余分なメソッド呼び出しを書かずに読みやすいテストを実現できる。

fixtureとパラメータ化

fixtureとパラメータ化

pytestを特徴づける機構がfixtureである。@pytest.fixtureを付けた関数はテストへ引数として注入され、依存関係はテスト側が引数名で宣言するだけで解決される。scope引数でfunction/class/module/sessionを選び、DBコネクションや一時ディレクトリ、モックサーバなどのライフサイクルを宣言的に管理できる。yieldを含むfixtureでは前処理と後処理を一体で書けるため、tearDownの書き忘れも起こりにくい。

パラメータ化は@pytest.mark.parametrizeで行う。同じテスト関数に対して入力値とexpectedの組を列挙すれば、テストケースが値ごとに展開される。複数のparametrizeを重ねればデカルト積になり、組み合わせテストも一行で記述できる。indirect=Trueを指定すれば値をfixtureに渡して動的な準備を行うこともでき、APIテストやデータ駆動テストで威力を発揮する。

プラグインとカバレッジ計測

プラグインとカバレッジ計測

pytestのエコシステムは1,000を超えるプラグインで構成されている。pytest-xdistは複数プロセスでの並列実行、pytest-covはCoverage.pyとの統合、pytest-mockはunittest.mockのラッパー、pytest-djangoはDjangoとの統合などを提供する。FastAPIのテストではpytest-asyncioが非同期コルーチンを扱う基本となる。

CI連携ではJUnit形式の出力(--junitxml)が事実上の標準で、GitHub ActionsやCircleCIのレポート画面に渡せる。型チェックのmypyと組み合わせる例、機械学習プロジェクトでpytest-benchmarkによりベンチマークを定量化する例、hypothesisによるプロパティベーステストとの連携など、応用範囲は非常に広い。Pythonのテストツール選定では、まずpytestを採用すれば外れにくいというのが現場の感覚である。

unittestや他言語との比較

unittestや他言語との比較

Python標準ライブラリunittestはJUnit譲りのxUnitスタイルで、TestCase継承とself.assertEqualのような明示的なメソッド呼び出しを行う。クラスベースの整然とした構造を好むならunittest、関数ベースの簡潔さとプラグイン拡張性を取るならpytest、という選択構図になる。新規プロジェクトではpytestが多数派だが、両者は併用可能で、unittest.TestCaseもpytestがそのまま実行できる。

他言語のRSpecやJestと比較すると、pytestは関数とfixtureを中心としたモデルで、DSLっぽさが控えめである。Pythonの言語仕様と相性が良く、依存性注入を自然な書き味で実現する点が長年支持されている理由である。言語標準のunittestと共存しつつ、エコシステム全体の中心としてpytestが据えられている、というのが現在のPythonテスト文化である。

まとめ

pytestはPyPy開発の副産物として始まりながら、関数ベースの簡潔さとfixture、豊富なプラグインを武器にPythonテストの中心ツールとなった。DjangoからAI/MLまで対応領域は広く、新規プロジェクトでまず採用しても外れにくい安定した選択肢であり、適切なfixture設計とプラグイン選びを身につけることが、Python開発者の必須スキルといってよい。

※本記事はIT用語辞典の手書きドラフトです。公開前に最新情報・出典を確認のうえ加筆修正してください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次