はじめに

完了済み

Pytest では、テストの検出とアサーション結果の報告以外の操作を行うことができます。 Pythonテスト スイートの拡張に伴い、テスト ロジックと共有セットアップ コードを繰り返し実行すると、テストの読み取り、デバッグ、および拡張が困難になります。 このモジュールでは、パラメーター化、フィクスチャ、組み込みの monkeypatch フィクスチャなど、Pythonテストを読みやすく保守可能な状態に保つために役立つ 3 つの pytest 機能について説明します。

このモジュールでは、Pythonスクリプトを記述し、ターミナルでコマンドを実行し、Python 3.10 以降の仮想環境で簡単な pytest テストを実行できることを前提としています。 Windowsのセットアップに関するヘルプが必要な場合は、「 Windowsを参照してください。 仮想環境の詳細については、Pythonの venv ドキュメントを参照してください。

@pytest.mark.parametrizeを使用したパラメーター化では、複数の引数セットで同じテスト関数が実行され、pytest は生成された各呼び出しを独自のテスト項目として収集します。 フィクスチャは、pytest に登録された関数で、通常、テストまたは他のフィクスチャが名前で要求する @pytest.fixture です。 再利用可能な値を返し、必要に応じて、テストスコープまたはフィクスチャスコープの終了後にクリーンアップを実行できます。 monkeypatchフィクスチャは、属性、ディクショナリ項目、環境変数、sys.path、または現在の作業ディレクトリを一時的に変更し、要求するテストまたはフィクスチャが完了した後、それらの変更を自動的に元に戻します。

このモジュールの例は単体スタイルのテストですが、大規模な統合または機能テスト スイートにも同じ pytest 機能が適用されます。 この例では、Pythonの assert ステートメントを使用します。pytest はアサーションのイントロスペクションを提供するため、エラー レポートには式の有用な値が含まれます。

これらの機能を使用する場合

  • パラメーター化は、テスト内の入力をループしたり、少し異なる入力に対してほぼ重複するテスト関数をコピーしたりする場合に使用します。 パラメーター化では、1 つのテスト定義が多数のテスト項目に展開されるため、各入力は独自の合格/失敗レポートを取得します。
  • 複数のテストで同じセットアップ (テスト データ、一時ファイル、データベース接続など) が必要な場合や、実行後に予測可能なクリーンアップが必要な場合は、 フィクスチャ を使用します。
  • テストで外部状態 (環境変数、現在の作業ディレクトリ、リモート サービスを呼び出す関数など) からコードを分離する必要がある場合は、その状態を永続的に変更せずに、 monkeypatch を使用します。

まず、ループとほぼ重複するテストをパラメーター化に置き換えます。 次に、フィクスチャを使用してセットアップとクリーンアップを共有し、 tmp_path や monkeypatchなどの組み込みのフィクスチャを確認し、xUnit スタイルのセットアップと破棄メソッドをフィクスチャにリファクタリングする練習をします。

このモジュールを終了すると、これらの pytest 機能を適用して、繰り返しを減らし、カバレッジを拡大し、Pythonテスト スイートで障害診断を改善する準備が整います。

詳細については、 アサーション、 パラメトリシング テスト、 フィクスチャ、 およびモンキーパッチに関する pytest ドキュメントを参照してください。