⚙️
Pytestを使ってSeleniumテストのレポートを自動生成する
こちらchatgptの回答になります。
Pytestを使ってSeleniumの自動テストを行い、テスト結果を統一的に管理する方法を解説します。Pytestは非常にシンプルかつ柔軟なPython用テストフレームワークで、Seleniumと組み合わせることで効率的にブラウザテストを実行できます。
Pytestを使ったSeleniumテストの概要
- Pytestをインストールし、テスト環境を整えます。
- SeleniumのテストスクリプトをPytest形式で作成します。
- 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