| 原作者 | Krekel ら |
|---|---|
| 安定版リリース | 8.3.3 [1]
/ 2024年9月10日 |
| リポジトリ |
|
| 書かれた | パイソン |
| プラットフォーム | macOS、Windows、POSIX |
| タイプ | ソフトウェアテストのフレームワーク |
| ライセンス | MITライセンス |
| Webサイト | pytest.org |
Pytest は、 PyPyプロジェクトから生まれたPythonテスト フレームワークです。単体テスト、統合テスト、エンドツーエンド テスト、機能テストなど、さまざまな種類のソフトウェア テストの作成に使用できます。その機能には、パラメーター化されたテスト、フィクスチャ、アサートの書き換えなどがあります。
Pytest フィクスチャは、テスト ケースでパラメータ名を渡すことによってテストのコンテキストを提供します。パラメータ化により、複数の入力と出力のセットをテストするための重複コードが排除され、書き換えられたアサート ステートメントによって、失敗の原因の詳細な出力が提供されます。
歴史
Pytestは、Pythonの組み込みモジュールunittestの欠点を解決するためのサードパーティパッケージの取り組みの一環として開発されました。これは、標準のCPythonに代わるPythonの実装である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の主要エコシステムプロジェクトの1つに分類されています。unittestとnose(別のテストパッケージ)からpytestに切り替えた有名なプロジェクトには、MozillaやDropboxなどがあります。[4] [5] [6] [7]
特徴
パラメータ化テスト
ソフトウェアテストでは、テスト関数を通じて値を送信し、正しい出力を確認するのが一般的なパターンです。多くの場合、機能を徹底的にテストするには、複数の入力/出力セットをテストする必要があり、そのようなケースを別々に記述すると、ほとんどのアクションは同じままで、入力/出力値のみが異なるため、コードの重複が発生します。Pytestのパラメータ化されたテスト機能は、異なる反復を1つのテストケースに組み合わせて、これらの反復を実行し、各テストの結果を個別に表示することで、このような重複コードを排除します。[8]
@pytest.mark.parametrize(argnames, argvalues) pytest のパラメータ化されたテストはデコレータによってマークされます。ここで、最初のパラメータ は、argnamesコンマで区切られた名前の文字列で、argvaluesは に渡す値のリストですargnames。 に複数の名前がある場合argnames、argvaluesはタプルのリストになり、各タプルの値は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
unittestpytestは、ほとんどのユニットテストライブラリと同様に、 Javaプログラミング言語のJUnitに触発されているため、より冗長な構文に従います。pytestは、Pythonの組み込みassert呼び出しを傍受しながら同じことを実現し、アプローチをより簡潔にします。[8] : 32 [6]
Pytestフィクスチャ
Pytest のテストは、コンピュータ コードが期待どおりに動作するかを検証します[10] 。テストは、AAA [11]と呼ばれる、arrange、act、assert のシーケンスで構造化されています。そのフィクスチャはテストのコンテキストを提供します。これらを使用して、システムを既知の状態にし、データをテスト関数に渡すことができます。フィクスチャは、実質的にテストの構造における配置フェーズを構成します (AAA、 arrange、act、assertの略)。[11] [10] Pytest のフィクスチャは、テスト ケースの前にセットアップとして実行することも、テスト ケースの後にクリーンアップとして実行することもできますが、unittest や nose (別のサードパーティの Python テスト フレームワーク) のセットアップやティアダウンとは異なります。pytest のフィクスチャとして宣言された関数は、デコレータによってマークされ、その名前をパラメーターとしてテスト関数に渡すことができます。[12] pytest は、テスト関数のパラメーターでフィクスチャの名前を見つけると、まず同じモジュールでそのようなフィクスチャを検索し、見つからない場合は conftest.py ファイルでそのようなフィクスチャを検索します。[8] : 61 @pytest.fixture
例えば:
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 のもう 1 つの機能は、テストをフィルタリングする機能です。これにより、開発者が希望するテストのみを選択して実行したり、開発者が希望する特定の方法で動作させたりすることができます。"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
参照
参考文献
- ^ 「リリース 8.3.3」。2024年9月10日。 2024年9月26日閲覧。
- ^ Bolz-Tereick, Carl Friedrich (2018年9月9日). 「PyPy Status Blog」. PyPy . 2022年7月6日時点のオリジナルよりアーカイブ。 2022年5月12日閲覧。
- ^ “History”. pytest . 2022年5月16日時点のオリジナルよりアーカイブ。2022年4月13日閲覧。
- ^ 「プロジェクトの例」。Pytest 。 2022年2月1日時点のオリジナルよりアーカイブ。 2022年2月1日閲覧。
- ^ Koorapati, Nipunn. 「オープンソースの Pytest ツール」。Dropbox。2024年 6 月 11 日時点のオリジナルよりアーカイブ。2022年2 月 1 日閲覧。
- ^ ab Oliveira, Bruno (2018 年 8 月). pytest クイック スタート ガイド. Packt Publishing . ISBN 978-1-78934-756-2. 2022年2月1日時点のオリジナルよりアーカイブ。2022年2月1日閲覧。
- ^ “pytest”. Snyk . 2022年6月27日時点のオリジナルよりアーカイブ。2022年5月12日閲覧。
- ^ abcdefghij Okken, Brian (2017年9月). Python Testing with Pytest (第1版). The Pragmatic Bookshelf. ISBN 9781680502404. 2022年1月20日時点のオリジナルよりアーカイブ。2022年1月22日閲覧。
- ^ “Parametrizing fixtures and test functions”. pytest.org . 2022年6月4日時点のオリジナルよりアーカイブ。2022年5月24日閲覧。
- ^ ab ヴィアフォア、パトリック(2021年7月12日)。ロバストPython。オライリーメディア社。ISBN 978-1-0981-0061-2. 2022年7月3日時点のオリジナルよりアーカイブ。2022年7月3日閲覧。
テストでは、構築したものが期待どおりに動作しているかどうかを確認します。
- ^ ab Khorikov, Vladimir (2020年1月)。ユニットテストの原則、実践、パターン。Manning Publications発行。ISBN 9781617296277. 2022年6月4日時点のオリジナルよりアーカイブ。2022年6月4日閲覧。
- ^ “フィクスチャについて”。Pytest 。 2022年2月7日時点のオリジナルよりアーカイブ。2022年2月7日閲覧。
- ^ Ashwin, Pajankar (2017年2月27日). Pythonユニットテスト自動化: Python開発者とテスターのための実践的テクニック. Apress. ISBN 9781484226766. 2022年3月7日時点のオリジナルよりアーカイブ。2022年3月7日閲覧。
- ^ Molina, Alessandro (2021年2月)。Pythonでテスト駆動型ソフトウェアを作成する。出版社: Packt Publishing。ISBN 9781838642655. 2022年3月8日時点のオリジナルよりアーカイブ。2022年3月8日閲覧。
外部リンク
- 公式サイト
- https://pypi.org/project/pytest/
- pytest.org を参照してください。
