⚙️

Pytestを使ってSeleniumテストのレポートを自動生成する

2024/09/05に公開

こちらchatgptの回答になります。

Pytestを使ってSeleniumの自動テストを行い、テスト結果を統一的に管理する方法を解説します。Pytestは非常にシンプルかつ柔軟なPython用テストフレームワークで、Seleniumと組み合わせることで効率的にブラウザテストを実行できます。

Pytestを使ったSeleniumテストの概要

  1. Pytestをインストールし、テスト環境を整えます。
  2. SeleniumのテストスクリプトをPytest形式で作成します。
  3. Pytestの機能を活用して、テスト結果のレポートを自動生成します。

1. Pytestと必要なライブラリのインストール

以下のコマンドで、PytestとSeleniumをインストールします。

pip install pytest selenium

2. PytestでのSeleniumテストの実装

以下の例では、ログインページのテストを行います。テストケースごとに結果を自動で収集し、Pytestのレポート機能で管理します。

テストスクリプト (test_login.py)

import pytest
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException

@pytest.fixture
def setup():
    driver = webdriver.Chrome()
    driver.get("http://example.com/login")
    yield driver
    driver.quit()

def test_login_success(setup):
    driver = setup
    driver.find_element("id", "username").send_keys("test_user")
    driver.find_element("id", "password").send_keys("correct_password")
    driver.find_element("id", "login_button").click()
    
    # ログイン成功を確認
    assert "Dashboard" in driver.title

def test_login_failure(setup):
    driver = setup
    driver.find_element("id", "username").send_keys("test_user")
    driver.find_element("id", "password").send_keys("incorrect_password")
    driver.find_element("id", "login_button").click()

    # ログイン失敗を確認
    assert "Invalid credentials" in driver.page_source

def test_missing_element(setup):
    driver = setup
    try:
        driver.find_element("id", "non_existent_element")
    except NoSuchElementException:
        pytest.fail("要素が見つかりません")

3. テスト実行と結果の確認

テストを実行するには、ターミナルで以下のコマンドを使います。

pytest --html=report.html

このコマンドで、テスト結果をreport.htmlというHTMLファイルに出力します。Pytestのレポート機能により、テストの成功/失敗が一目で分かる詳細なレポートが生成されます。

実行後のレポートの内容

  • テスト結果の詳細: 各テストケースの成功/失敗が視覚的に確認できる。
  • エラー詳細: 失敗したテストケースについて、エラーメッセージやスタックトレースが記録される。
  • スクリーンショットの添付: テスト失敗時に自動でスクリーンショットを取得し、レポートに添付することも可能です(後述)。

4. スクリーンショットの自動取得

テストが失敗した際に、スクリーンショットを自動で取得してレポートに含める方法です。

スクリーンショット取得を追加

import os
import pytest

@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):
    # テスト結果を取得
    outcome = yield
    report = outcome.get_result()
    
    # 失敗した場合、スクリーンショットを保存
    if report.when == 'call' and report.failed:
        driver = item.funcargs['setup']  # fixtureからドライバを取得
        screenshot_path = os.path.join(os.getcwd(), "screenshots", f"{item.name}.png")
        driver.save_screenshot(screenshot_path)
        report.extra = report.extra or []
        report.extra.append(pytest_html.extras.image(screenshot_path))

5. Pytestの利点

  • シンプルな記述: Pytestは複雑な設定を必要とせず、シンプルにテストケースを記述できます。
  • 自動レポート生成: HTML形式のレポートが自動的に生成されるため、視覚的にテスト結果を確認できます。
  • 再利用可能なコード: @pytest.fixtureを使って、セットアップやティアダウンの処理を共通化できます。

この方法で、Pytestを使ったSeleniumのテスト自動化が効率的に進み、統一感のあるテスト管理が可能になります。

Discussion