🧪 Pytest中級編:パラメータ化とフィクスチャの活用
📌 はじめに
この中級編では、Pytestのさらなる便利機能である パラメータ化 や フィクスチャ、マーク機能 など、実践的なテストを書くために必要なテクニックを紹介します。これらの機能を活用することで、テストの再利用性や可読性を高め、大規模なプロジェクトにも対応できるようになります。実務の現場では、テストの保守性や実行効率が求められるため、これらの中級テクニックは非常に重要です。コードの品質を高めるだけでなく、チーム開発における統一的なテスト設計にも役立ちます。
✅ パラメータ化で効率的にテストを書く
同じ関数を異なる引数で何度もテストしたい場合、@pytest.mark.parametrize を使うとコードが簡潔になります。これにより、同じようなテストコードを何度も書かずに済み、読みやすさとメンテナンス性が向上します。
import pytest
from calc import add
@pytest.mark.parametrize("a,b,expected", [
(1, 2, 3),
(0, 0, 0),
(-1, -1, -2),
(100, 200, 300),
(-5, 5, 0)
])
def test_add(a, b, expected):
assert add(a, b) == expected
このように、複数の入力データを1つのテスト関数に渡すことで、コードの量を減らし、ロジックの検証を効率化できます。
🛠 フィクスチャ(fixture)の活用
テスト前に共通の準備が必要な場合、@pytest.fixture を使うことでコードを再利用できます。これにより、テストの重複を避け、データ準備や初期化コードをまとめて記述できます。
import pytest
@pytest.fixture
def sample_data():
return {"name": "Alice", "age": 30, "email": "alice@example.com"}
def test_name(sample_data):
assert sample_data["name"] == "Alice"
def test_age(sample_data):
assert sample_data["age"] == 30
def test_email(sample_data):
assert sample_data["email"] == "alice@example.com"
また、フィクスチャは依存関係を定義することで、複雑な前処理も整理できます。たとえば、ファイルの作成やデータベースの接続などをフィクスチャでカプセル化することで、テストごとに安全かつ簡潔な初期化が行えます。
🌿 マーク(mark)の使い方
Pytestでは、テストに対してタグのような マーク をつけて管理できます。これにより、特定の種類のテストだけを選択的に実行することができ、実行時間の短縮や開発中の集中テストに役立ちます。
import pytest
@pytest.mark.slow
def test_large_dataset():
# 時間がかかるテスト処理
data = [x ** 2 for x in range(10**6)]
assert len(data) == 10**6
特定のマークだけを実行するには次のようにします:
pytest -m slow
このような仕組みは、テストケースが多くなる現場で非常に重宝されます。ほかにも @pytest.mark.skip, @pytest.mark.xfail なども便利です。
🧰 テストのグループ化とスキップ
複数のテストをクラスでまとめる:
クラスを使ってテストを整理することで、関連するテストを論理的にまとめることができます。
class TestMath:
def test_add(self):
assert 1 + 1 == 2
def test_subtract(self):
assert 2 - 1 == 1
def test_multiply(self):
assert 2 * 3 == 6
クラス名は Test で始めるとよい習慣です。クラスを使うと、セットアップメソッドや共有状態の管理もしやすくなります。
テストを一時的にスキップする:
テストがまだ未実装だったり、現在は実行しない方が良い場合に、スキップマークを活用します。
import pytest
@pytest.mark.skip(reason="まだ実装していません")
def test_future():
assert False
スキップされたテストは、レポートにも明示的に「スキップ済み」と表示されるため、管理がしやすくなります。
📌 よくあるエラーとデバッグのヒント
テストを書く中でよく遭遇する問題とその対処法を紹介します:
- Fixtureが見つからない: 名前を間違えていないか、引数に正しく指定されているか確認しましょう。
- Parametrizeの引数順: 引数名と値の順番が一致しているか要確認です。
- マークが無効:
pytest.iniにマークを登録していない場合、警告が出ます。以下のように設定します:
# pytest.ini
[pytest]
markers =
slow: 時間のかかるテスト
integration: 結合テスト用
- ImportError: モジュールの読み込みに失敗している場合、PYTHONPATHや仮想環境の設定を確認します。
-
AssertionErrorのメッセージが見づらい:
--tb=shortや-vオプションをつけて実行することで、出力を見やすくできます。
🔺 まとめ
このPytest中級編では、Pytestをより効率的に使うための以下のテクニックを紹介しました:
-
@pytest.mark.parametrizeによるテストのパラメータ化と多様な入力への対応 -
@pytest.fixtureを使った共通処理の再利用とテスト設計の効率化 - テスト分類や実行制御に便利なマーク機能と活用例
- クラスを使ったテストのグループ化と一時的なスキップの方法
- よくあるエラーの対処法やデバッグのヒント
これらのテクニックを身につけることで、テストコードの保守性・拡張性が大きく向上します。チーム開発においても、可読性と共通ルールを保った品質の高いテストコードを書くことができます。
次回の上級編では、モック(mock)の活用、例外処理のテスト、CIツールとの連携 など、より実践的で応用力のあるテスト技術を紹介していきます。お楽しみに!
株式会社ONE WEDGE
【Serverlessで世の中をもっと楽しく】 ONE WEDGEはServerlessシステム開発を中核技術としてWeb系システム開発、AWS/GCPを利用した業務システム・サービス開発、PWAを用いたモバイル開発、Alexaスキル開発など、元気と技術力を武器にお客様に真摯に向き合う価値創造企業です。
Discussion