pytest

良い記事ですね。詳しくはこちらをクリックしてください。

パイテスト
原作者Krekelら
安定版リリース
9.0.2 [ 1 ] ウィキデータで編集する / 2025年12月6日 (2025年12月6日
リポジトリ
書かれたパイソン
プラットフォームmacOSWindowsPOSIX
タイプソフトウェアテストフレームワーク
ライセンスMITライセンス
Webサイトpytest.org ウィキデータで編集する

Pytestは、 PyPyプロジェクトから生まれたPythonテストフレームワークです。ユニットテスト統合テストエンドツーエンドテスト機能テストなど、さまざまな種類のソフトウェアテストの作成に使用できます。パラメータ化テスト、フィクスチャアサート書き換え などの機能を備えています。

Pytest フィクスチャは、テスト ケースでパラメータ名を渡すことによってテストのコンテキストを提供します。パラメータ化により、複数の入力と出力のセットをテストするための重複コードが排除され、書き換えられたアサート ステートメントによって、失敗の原因の詳細な出力が提供されます。

歴史

Pytestは、Pythonの組み込みモジュールunittestの欠点を補うためのサードパーティ製パッケージの取り組みの一環として開発されました。これは、標準CPythonの代替実装であるPyPyの一部として開発されました。2003年初頭の開発以来、PyPyはテストに重点を置いてきました。PyPyには、新規に記述されたコードの単体テスト、バグの回帰テスト、そしてCPythonのテストスイートを用いた統合テストが含まれていました。[ 2 ]

2004年半ば、utestと呼ばれるテストフレームワークが登場し、PyPyの貢献者たちは既存のテストケースをutestに書き換え始めました。一方、EuroPython 2004では、テスト用の補完的な標準ライブラリであるstdが発明されました。このパッケージは、アサート書き換えなど、後にpytestとなるものの原則を規定していました。2004年後半、stdプロジェクトはpyに改名され、std.utestはpy.testとなり、pyライブラリはPyPyから分離されました。2010年11月、pytest 2.0.0がpyとは別のパッケージとしてリリースされました。2016年8月まではpy.testという名前でしたが、pytest 3.0.0のリリース以降、推奨されるコマンドラインエントリポイントはpytestになりました。[ 3 ]

Pytestは、その人気の高さから、開発者セキュリティプラットフォームSnykによってPythonの主要エコシステムプロジェクトの一つに分類されています。unittestやnose(別のテストパッケージ)からpytestに切り替えた著名なプロジェクトには、MozillaDropboxなどがあります。[ 4 ] [ 5 ] [ 6 ] [ 7 ]

特徴

パラメータ化テスト

ソフトウェアテストでは、テスト関数に値を送信し、正しい出力を確認するのが一般的なパターンです。多くの場合、機能を徹底的にテストするには、複数の入出力セットをテストする必要がありますが、そのようなケースを個別に記述すると、ほとんどのアクションは同じままで、入出力値のみが異なるため、コードが重複してしまいます。Pytestのパラメータ化テスト機能は、異なる反復処理を1つのテストケースにまとめ、それらの反復処理を実行して各テストの結果を個別に表示することで、このような重複コードを排除します。[ 8 ]

pytest のパラメータ化されたテストは@pytest.mark.parametrize(argnames, argvalues)デコレータによってマークされます。ここで、最初のパラメータargnamesはコンマで区切られた名前の文字列で、argvaluesは に渡す値のリストですargnames。 に複数の名前がある場合argnamesargvaluesはタプルのリストになり、各タプルの値はargnamesインデックスによって 内の名前に対応します。 内の名前argnamesは、デコレータによってマークされたテスト関数にパラメータとして渡されます。pytest がこのようなデコレートされたテストを実行すると、 と の各ペアは、argnames独自argvaluesのテスト出力と一意の識別子を持つ個別の実行を構成します。その後、識別子を使用して個々のデータペアを実行できます。[ 8 ] : 52–58 [ 9 ]

アサート書き換え

ソフトウェアテストを書くとき、assert文は期待値と実際の値を比較するテストの失敗を伝えるための主な手段です。[ 8 ]:32–34 Pythonの組み込みassertキーワードは、失敗した場合に詳細を示さずにAssertionErrorを発生させるだけですが、pytestはPythonのassertキーワードを書き換え、assert文内の式がどのような評価結果になるかなど、失敗の原因に関する詳細な出力を提供します。unittest(Pythonのテスト用組み込みモジュール)のassert文と比較することができます。[ 8 ]:32

pytest ユニットテスト
assertxassertTrue(x)
assertx==yassertEqual(x, y)
assertx<=yassertLessEqual(x, y)

unittestpytestは、ほとんどのユニットテストライブラリと同様に、 Javaプログラミング言語のJUnitに触発されているため、より冗長な構文に従います。pytestは、Pythonの組み込みassert呼び出しを傍受しながら同じことを実現し、アプローチをより簡潔にします。[ 8 ]:32 [ 6 ]

Pytestフィクスチャ

Pytestのテストは、コンピュータコードが期待通りに動作するかを検証します[ 10 ]。テストは、AAAと呼ばれるarrange、act、assertのシーケンスで構造化されています[ 11 ] 。そのフィクスチャはテストのコンテキストを提供します。これらを使用して、システムを既知の状態にし、テスト関数にデータを渡すことができます。フィクスチャは、実質的にテストの構造における配置フェーズを構成します(AAA、 arrangeactassertの略)。[ 11 ] [ 10 ] Pytestのフィクスチャは、テストケースの前にセットアップとして実行することも、テストケースの後にクリーンアップとして実行することもできますが、unittestやnose(別のサードパーティ製のPythonテストフレームワーク)のセットアップティアダウンとは異なります。pytestのフィクスチャとして宣言された関数は@pytest.fixtureデコレータでマークされ、その名前をテスト関数にパラメータとして渡すことができます。[ 12 ] pytestはテスト関数のパラメータでフィクスチャ名を見つけると、まず同じモジュール内でそのようなフィクスチャを検索し、見つからない場合はconftest.pyファイル内でそのようなフィクスチャを検索します。[ 8 ] : 61

例えば:

pytestをインポートする@pytest . fixture def dataset (): """テスト関数にデータを返す""" return { "data1" : 1 , "data2" : 2 }def test_dataset ( dataset ): """フィクスチャの値をテストして確認する""" assert dataset == { "data1" : 1 , "data2" : 2 }

上記の例では、pytestフィクスチャはdataset辞書を返し、それがtest_datasetアサーションのためにテスト関数に渡されます。テストケースと同じファイル内でのフィクスチャ検出に加えて、pytestフィクスチャはtestsディレクトリ内のconftest.pyファイルに配置することもできます。複数のconftest.pyファイルをtestsディレクトリ内に配置することで、テストのサブセットごとにフィクスチャを検出できます。[ 8 ] :63

フィクスチャスコープ

pytestでは、フィクスチャスコープによって、フィクスチャをいつ呼び出すかをユーザーが定義できます。フィクスチャスコープには、関数スコープクラススコープ、モジュールスコープ、セッションスコープの4つがあります。関数スコープのフィクスチャは、すべてのpytestフィクスチャのデフォルトであり、フィクスチャをパラメータとして持つ関数が実行されるたびに呼び出されます。より広いフィクスチャスコープを指定する目的は、テスト実行を遅くする可能性のあるフィクスチャの繰り返し呼び出しを排除することです。クラススコープのフィクスチャは、呼び出された回数に関係なく、テストクラスごとに1回呼び出され、他のすべてのスコープにも同じロジックが適用されます。フィクスチャスコープを変更する場合は、フィクスチャデコレータにスコープパラメータを追加するだけです。たとえば、。[ 8 ] : 72 [ 13 ]@pytest.fixture(scope="class")

フィルタリングをテストする

pytestのもう一つの特徴は、テストをフィルタリングする機能です。これにより、開発者の希望に応じて、必要なテストのみを実行したり、特定の動作をさせたりすることができます。「k」オプション(例:pytest -k some_name)を指定すると、pytestは名前に が含まれるテストのみを実行しますsome_name。その逆も同様で、 を実行すると、pytestは名前に を含まないすべてのテストを実行します。[ 14 ]pytest -k "not some_name"some_name

Pytestのマーカーは、テストの挙動を変更するだけでなく、テストをフィルタリングすることもできます。Pytestのマーカーは、テスト関数の先頭に配置される構文で始まるPythonデコレータです。任意の名前のマーカーをコマンドラインで実行すると、そのマーカーでデコレートされたテストのみが実行されます。[ 8 ] : 13 利用可能なすべてのマーカーは、説明とともに で一覧表示できます。また、ユーザーがカスタムマーカーを定義してpytest.iniに登録することもできます。その場合、 は組み込みマーカーに加えて、それらのカスタムマーカーも一覧表示します。[ 8 ] : 147 @pytest.mark.<markername>pytest -m <markername>pytest --markerspytest --markers

参照

参考文献

  1. ^ 「リリース 9.0.2」。2025年12月6日。 2025年12月8日閲覧
  2. ^ Bolz-Tereick, Carl Friedrich (2018年9月9日). 「PyPy Status Blog」 . PyPy . 2022年7月6日時点のオリジナルよりアーカイブ2022年5月12日閲覧。
  3. ^ “History” . pytest . 2022年5月16日時点のオリジナルよりアーカイブ。 2022年4月13日閲覧
  4. ^ 「プロジェクトの例」 . Pytest . 2022年2月1日時点のオリジナルよりアーカイブ。 2022年2月1日閲覧
  5. ^ Koorapati, Nipunn. 「オープンソースPytestツール」 . Dropbox . 2024年6月11日時点のオリジナルよりアーカイブ。 2022年2月1日閲覧
  6. ^ a bオリベイラ、ブルーノ (2018 年 8 月). pytest クイック スタート ガイドパックト出版ISBN 978-1-78934-756-2. 2022年2月1日時点のオリジナルよりアーカイブ。2022年2月1日閲覧。
  7. ^ "pytest" . Snyk . 2022年6月27日時点のオリジナルよりアーカイブ2022年5月12日閲覧。
  8. ^ a b c d e f g h i j Okken, Brian (2017年9月). Python Testing with Pytest (第1版). The Pragmatic Bookshelf. ISBN 9781680502404. 2022年1月20日時点のオリジナルよりアーカイブ。2022年1月22日閲覧。
  9. ^ “Parametrizing fixtures and test functions” . pytest.org . 2022年6月4日時点のオリジナルよりアーカイブ。 2022年5月24日閲覧
  10. ^ a b Viafore, Patrick (2021年7月12日). Robust Python . O'Reilly Media, Inc. ISBN 978-1-0981-0061-2. 2022年7月3日時点のオリジナルよりアーカイブ。 2022年7月3日閲覧テストは、構築したものが期待どおりに動作しているかどうかを検証します。
  11. ^ a b Khorikov, Vladimir (2020年1月).ユニットテストの原則、実践、パターン. Manning Publications発行. ISBN 9781617296277. 2022年6月4日時点のオリジナルよりアーカイブ。2022年6月4日閲覧。
  12. ^ “フィクスチャについて” . Pytest . 2022年2月7日時点のオリジナルよりアーカイブ2022年2月7日閲覧。
  13. ^ Ashwin, Pajankar (2017年2月27日). Pythonユニットテスト自動化:Python開発者とテスターのための実践的テクニック. Apress. ISBN 9781484226766. 2022年3月7日時点のオリジナルよりアーカイブ。2022年3月7日閲覧。
  14. ^ Molina, Alessandro (2021年2月). Pythonによるテスト駆動ソフトウェアの作成. 出版社: Packt Publishing. ISBN 9781838642655. 2022年3月8日時点のオリジナルよりアーカイブ。2022年3月8日閲覧。