PyTestチュートリアル:インストール、テスト作成、実行でPythonテストに自信を
PyTestとは
PyTestは、Pythonプロジェクト(ユニットテスト、統合テスト、エンドツーエンドAPIチェックなど)に対して簡潔でスケーラブルなテストケースを記述できる強力なオープンソーステストフレームワークです。並列実行、フィクスチャ注入、パラメータ化、豊富なレポート機能を標準でサポートしています。
PyTestを選ぶ理由
- ボイラープレートを削減するシンプルで可読性の高い構文
- 自動テスト検出と実行
-kとマーカーで特定テストやグループを実行可能pytest-xdistによる並列実行のビルトインサポート- フィクスチャ、フック、プラグインで拡張可能
- 無料でコミュニティによって活発にメンテナンス
PyTestのインストール
pipで最新安定版をインストール:
pip install pytest
インストール確認:
pytest --version
特定バージョンを固定する場合: pip install pytest==7.4.0。
はじめの一歩:基本テスト
プロジェクトディレクトリを作成し、test_sample1.pyというテストファイルを追加:
import pytest
def test_file1_method1():
x = 5
y = 6
assert x + 1 == y, "Addition failed"
assert x == y, "Values should match"
def test_file1_method2():
x = 5
y = 6
assert x + 1 == y, "Addition failed"
テストスイートを実行:
pytest
出力例:
==================== test session starts ====================
collected 2 items
test_sample1.py F. [100%]
=================================== FAILURES ===================================
...
アサーションの理解
PyTestのアサーションは標準Pythonのassert文と同様に振る舞います。失敗時、テストは実行を停止し、PyTestが正確な場所とメッセージを報告:
assert "hello" == "Hai", "Mismatched greeting"
テスト検出ルール
- ファイル名は
test_で始まるか_test.pyで終わる必要がある。 - テスト関数は
test_で始まる必要がある。 - それ以外のファイルや関数は明示指定しない限り無視される。
特定テストの実行
ディレクトリ内の全テスト実行:
pytest
単一ファイル実行:
pytest test_sample1.py
部分文字列でフィルタ:
pytest -k method1 -v
マーカーで実行:
pytest -m set1
並列実行
xdistプラグインをインストールし、4ワーカーで並列実行:
pip install pytest-xdist pytest -n 4
フィクスチャの活用
再利用可能なセットアップロジックを一度定義し、テストに注入:
import pytest
@pytest.fixture
def supply_data():
return [25, 35, 45]
def test_compare_with_first(supply_data):
assert supply_data[0] == 25
フィクスチャコードをconftest.pyに配置すれば複数テストモジュールで共有可能。
パラメータ化テスト
単一テストを複数入力で実行:
import pytest
@pytest.mark.parametrize("a, b, expected", [(5, 5, 10), (3, 5, 8)])
def test_add(a, b, expected):
assert a + b == expected
スキップと期待される失敗
マーカーを使って結果を汚さずにスキップや期待失敗を指定:
import pytest
@pytest.mark.skip(reason="Feature not yet available")
def test_future_feature():
pass
@pytest.mark.xfail(reason="Known bug")
def test_known_issue():
assert 1 == 2
XMLレポート生成
CIパイプライン用のJUnit互換XMLファイル生成:
pytest -v --junitxml=result.xml
実践例:公開APIのテスト
以下はhttps://reqres.in/をテストする最小フレームワーク:
# conftest.py
import pytest
@pytest.fixture
def base_url():
return "https://reqres.in/api"
# test_list_user.py
import requests, json
import pytest
@pytest.mark.parametrize("user_id, first_name", [(1, "George"), (2, "Janet")])
def test_valid_user(base_url, user_id, first_name):
resp = requests.get(f"{base_url}/users/{user_id}")
data = json.loads(resp.text)
assert resp.status_code == 200
assert data["data"]["id"] == user_id
assert data["data"]["first_name"] == first_name
def test_invalid_user(base_url):
resp = requests.get(f"{base_url}/users/50")
assert resp.status_code == 404
# test_login_user.py
import requests, json
import pytest
def test_login_success(base_url):
payload = {"email": "test@test.com", "password": "something"}
resp = requests.post(f"{base_url}/login/", data=payload)
data = json.loads(resp.text)
assert resp.status_code == 200
assert data["token"] == "QpwL5tke4Pnpja7X"
def test_login_missing_password(base_url):
payload = {"email": "test@test.com"}
resp = requests.post(f"{base_url}/login/", data=payload)
data = json.loads(resp.text)
assert resp.status_code == 400
assert data["error"] == "Missing password"
結論
このチュートリアルでは、PyTestのインストール、明確なテスト作成、フィクスチャとマーカーの活用、並列実行、XMLレポート生成、シンプルなAPIテストスイート構築をカバーしました。これらの基礎があれば、Pythonテストプラクティスを自信を持ってスケールできます。
Python
- メンテナンス バックログの解説:解決のための戦略
- 真空管テスター完全ガイド:選び方・種類・精度・メンテナンス
- ネットワークセキュリティキーを見つけて保護する:Wi-Fiを守る簡単な手順
- Wi-Fi通話完全解説:仕組みとメリット、なぜ重要か
- 6G徹底解説:超高速接続を実現する次世代通信技術の全貌
- 部分放電試験の理解:高圧機器を守る
- ポンプキャビテーションを防ぐ:原因、症状、回避方法
- 銅ブレージング完全解説:強力で信頼性の高い接続のための技術とヒント
- ドックレベラー設置のエキスパートガイド:最大効率を実現する手順
- Google CloudへのWordPressインストール:ステップバイステップガイド
- Coded UI Test自動化フレームワーク:初心者向け包括ガイド