Pytestを活用した汎用自動テストフレームワークの設計と実装

要件定義とアーキテクチャ設計

テストフレームワークは、特定の課題を体系的に解決するために構築される。本フレームワークでは、API・Web UI・モバイルアプリの全領域をカバーする統合型自動テスト基盤を目指す。

核心機能要件

  1. API/Web/Appのマルチプラットフォーム対応
  2. バッチ実行と可視化レポート生成
  3. 完了通知メールの自動送信
  4. モジュール/優先度/タグによる柔軟な実行制御
  5. 詳細ログによるトラブルシューティング支援
  6. 環境切り替え機構(開発/ステージング/本番)
  7. DB結果検証機能
  8. 保守性の最適化
  9. 実行安定性の強化
  10. 並列処理による高速化

技術実装戦略

マルチプラットフォーム対応

各レイヤー専用ライブラリをラッピング:

  • API:requests
  • Web:selenium
  • App:appium-python-client
ディレクトリ構造は/tests/api, /tests/web, /tests/mobileで分離管理。

pip install requests selenium Appium-Python-Client

レポート生成と通知

Allureレポートシステムを採用。実行後フックでメール送信をトリガー:

def pytest_sessionfinish(session):
    if session.config.getoption("--send-report"):
        ReportMailer().compress_and_send()

SMTP設定はconfig/mail.yamlで外部化。

実行制御機構

階層的タグ付けで柔軟なフィルタリングを実現:

@pytest.mark.module("user_management")
@allure.severity(allure.severity_level.CRITICAL)
def test_user_creation():
    # テストロジック

実行例:pytest -m "module and severity"

ロギング基盤

Python標準loggingモジュールを統合。タイムスタンプ/モジュール名/レベル情報を含む構造化ログ:

[INFO][2024-01-01 10:00:00][api_client.py:45] Request sent to /users

環境切り替え

動的ベースURLと変数ファイルの組み合わせ:

pytest --base-url=https://staging-api.com --vars=config/staging.yaml

設定ファイルでデフォルト値を定義可能。

データベース検証

pymysqlをラップしたコンテキストマネージャ:

@pytest.fixture
def db_checker():
    with DatabaseConnection() as conn:
        yield conn
        # 自動クリーンアップ

保守性向上設計

3層アーキテクチャで責務分離:

  • インフラ層:HTTP/DB/WebDriver操作
  • サービス層:ビジネスロジックカプセル化
  • テスト層:シナリオ記述

安定性対策

不安定テスト対策の多重防御:

@pytest.mark.flaky(reruns=3, reruns_delay=5)
@pytest.mark.skipif(not is_service_available(), reason="Service down")
def test_payment_flow():
    driver.implicitly_wait(10)  # 動的待機
    handle_popups()  # ポップアップ監視スレッド

パフォーマンス最適化

プロセス並列化とタイムアウト保護:

pytest -n auto --timeout=120 --dist=loadfile

ファイル単位で負荷分散し、無限待ちを防止。

拡張機能設計

機能実装技術目的
複合アサーションpytest-check部分失敗許容
スキーマ検証jsonschemaレスポンス構造チェック
データ駆動PyYAMLテストデータ外部化
設定管理pytest.ini環境依存設定分離

タグ: pytest 自動テスト Allure pytest-xdist pytest-rerunfailures

6月10日 23:09 投稿