Python応用

Pythonテストのベストプラクティス!pytest で「良いテスト」を書く5つのコツ

「テストを書いているのに、なぜかバグが見つからない…」そんな経験、ありませんか?

Pythonはテストツールが充実しているので、テストをたくさん書くのは簡単です。でも「良いテスト」を書けているかどうかは、また別の話なんですよね。

カバレッジ(テスト網羅率)を追いかけるだけだったり、モックを使いすぎて本物の動作を確認できていなかったり……。CIは通るのに本番でバグが出る、という悲劇はここから生まれます。

今回は Testing Best Practices in Python として、pytestを使った「本当に意味のあるテスト」の書き方を5つのポイントに絞って解説します 🐍

✅ ポイント①:parametrize で重複テストをまとめる

python testing
python testing / Photo by Mikael Monjour via Pexels

同じテストを「入力値だけ変えてコピペ」していませんか? それ、pytest.mark.parametrize で一発解決できます。

# ❌ こうなりがちなコピペテスト
def test_add_1():
    assert add(1, 2) == 3

def test_add_2():
    assert add(0, 0) == 0

# ✅ parametrize でスッキリまとめる
import pytest

@pytest.mark.parametrize("a, b, expected", [
    (1, 2, 3),   # 通常ケース
    (0, 0, 0),   # ゼロ同士
    (-1, 1, 0),  # マイナス値
])
def test_add(a, b, expected):
    assert add(a, b) == expected

ポイントをまとめるとこんな感じです👇

  • 入力パターンをリストで管理できるので追加・修正が楽
  • テスト名にパラメータが自動で入るので失敗箇所が一目瞭然
  • コードの重複が減り、メンテナンスコストが下がる

✅ ポイント②:fixture で前処理・後処理を共通化する

DBの接続やファイルの準備など、テストの「準備と後片付け」を毎回書くのは非効率です。fixture を使えばその処理を再利用できます。

import pytest

@pytest.fixture
def sample_user():
    # テスト前の準備(Arrange)
    user = {"name": "田中", "age": 30}
    yield user  # ← ここでテスト本体に渡す
    # テスト後の後片付け(Teardown)があればここに書く

def test_user_name(sample_user):
    # fixture を引数として受け取るだけでOK ✨
    assert sample_user["name"] == "田中"

def test_user_age(sample_user):
    assert sample_user["age"] == 30

✅ ポイント③:モックのしすぎに注意する


外部APIやDBをモック(偽物に差し替え)することは大切ですが、モックしすぎると「コードの形だけテストして、実際の動作を確認していない」 状態になります。

イメージとしては、「実際に料理せずに、レシピを読み上げるだけ」みたいな感じです。

pytestの monkeypatch を使いつつも、モックの範囲は最小限にとどめましょう。

✅ ポイント④:テスト名は「何をテストしているか」が分かる名前に

test_1test_func という名前では、失敗したときに原因が分かりません。test_割引後の価格が正しく計算される のように、日本語でも英語でも「意図が伝わる名前」 をつける習慣をつけましょう。

✅ ポイント⑤:カバレッジより「重要なロジックのテスト」を優先

100%カバレッジを目指すより、ビジネスロジックの境界値・エラーケース・副作用のあるコード を重点的にテストする方が実際のバグ検出につながります。

まとめ

Pythonの Testing Best Practices を5つのポイントで整理しました 🎉

  • parametrize で重複テストをまとめる
  • fixture で前後処理を共通化する
  • モックは最小限にとどめる
  • テスト名は意図が伝わるものにする
  • カバレッジより重要ロジックを優先する

「テストを書く」から「良いテストを書く」へ。この5つを意識するだけで、テストの質がぐっと上がりますよ。ぜひ今日のコードから試してみてください!💪

📚 関連商品・おすすめ書籍

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

もしも

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

初心者に定番のPython入門書

Amazonで見る

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

もしも

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

電子工作とプログラミングを同時に学べる

Amazonで見る

Python Web開発実践入門 ―― FastAPIによるWebAPI開発と非同期処理

もしも

Python Web開発実践入門 ―― FastAPIによるWebAPI開発と非同期処理

FastAPIでWebAPI開発を実践的に学ぶ

Amazonで見る

※本記事にはアフィリエイトリンクが含まれます。

ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 Pythonを用いたアプリ開発、ウェブアプリケーションの開発で業務の効率化をサポートしています。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です