pytest vs unittest: CIにどちらのPythonテストランナーを使うべきか?
unittestはPythonに同梱されています。pytestはより簡潔なテスト、強力なfixture、豊富なプラグインエコシステムを追加し、さらにunittestのテストも実行できます。
unittestはPython組み込みのxUnitスタイルのフレームワークです。pytestはサードパーティのフレームワークで、素のassert構文、fixture、パラメータ化、大きなプラグインエコシステムを備え、unittestスタイルのテストを検出して実行することもできます。
| unittest | pytest | |
|---|---|---|
| Pythonに同梱 | あり | なし (pip install) |
| テストスタイル | クラス + self.assert* | 素のassert + 関数 |
| Fixture | setUp/tearDown | 強力なfixtureシステム |
| パラメータ化 | 手動 / subTest | 組み込み (@parametrize) |
| プラグイン / 並列実行 | 限定的 | 豊富 (pytest-xdist など) |
CIでの挙動
pytestは通常、開発者体験とCIの使い勝手で優れています。簡潔なテスト、パラメータ化、fixture、そして並列実行のためのpytest-xdistやcoverageのためのpytest-covといったプラグインです。既存のunittestのテストも実行できるため、段階的に導入できます。unittestはインストール不要で、追加の依存関係をゼロにしたい場合や標準ライブラリに制約される場合には良い選択肢です。
不安定なテスト
pytest-xdistを使って大きなスイートを並列化し、一過性の失敗を再試行できるよう計画しましょう (例: pytest-rerunfailures)。不安定なテストがビルドを失敗させないためです。より高速なマネージドrunnerは、長いPythonテストマトリクスを短縮します。
結論
簡潔なテスト、fixture、パラメータ化、並列プラグインが欲しいなら: pytest (unittestのテストも実行します)。追加の依存関係ゼロや標準ライブラリのみが必要なら: unittest。ほとんどのチームはCIでpytestを選びます。
関連ガイド
How to Cache Dependencies in GitHub Actions (Every Ecosystem)Cache dependencies in GitHub Actions with actions/cache - correct keys and paths for npm, yarn, pnpm, pip, Ma…
Self-Healing CI: Containing Flaky Tests Without Hiding Real BugsFlaky tests fail intermittently with no code change. Learn how to identify them and how self-healing CI retri…
How to Speed Up GitHub Actions: 9 High-Impact TacticsMake GitHub Actions faster: caching, parallelization, test splitting, Docker layer caching, slimmer images, a…