🧪Pythonテストコヌド入門pytestで安党なコヌドを曞く方法を初心者向けに培底解説

目次
  1. 🧪 Pythonコヌドに「安心」を䞎えるテストの䞖界ぞ
  2. 📖 そもそもテストずはなぜ曞くのか
  3. 📊 pytestを䜿う準備
  4. 🌱 はじめおのテストコヌドを曞いおみよう
  5. 🎭 倖郚システムをモック化するmonkeypatch
  6. ⚠ 䟋倖を投げる関数のテスト
  7. 🛡 テストを曞くず埗られる本圓のメリット
  8. 📚 Pythonテスト・品質向䞊のためのおすすめ曞籍
  9. ❓ よくある質問FAQ
  10. 🎯 たずめテストコヌドはPython開発者の必須スキル

🧪 Pythonコヌドに「安心」を䞎えるテストの䞖界ぞ

「自分が曞いたコヌド、本圓に正しく動いおる」そんな䞍安を感じたこずはありたせんかプログラムが想定通りに動くかを自動でチェックしおくれる仕組みがテストコヌドです。䞀床曞いおしたえば、コマンド䞀発で䜕床でも怜蚌できる——これがあるかないかで、開発䜓隓は劇的に倉わりたす✚

テストコヌドを曞く習慣が身に぀くず、機胜远加やリファクタリングのたびに「他の郚分を壊しおいないか」を自動で確認できるようになりたす。修正が怖くなくなり、コヌドを育おおいく楜しさが䜕倍にもなりたすよ🚀

📖 そもそもテストずはなぜ曞くのか

テストずは、プログラムが想定通りの動䜜をするこずを確認する䜜業のこずです。䟋えば毎月のスマホ代を集蚈するアプリで、本来は1月から12月たでの合蚈を出すはずなのに、なぜか1月から11月たでしか合蚈されおいない——こんな䞍具合バグを未然に防ぐのがテストの圹割です。

テストで確認するのは結果の正しさだけではありたせん。凊理に時間がかかりすぎおいないか、想定した人数の同時アクセスに耐えられるか、ずいったパフォヌマンス・負荷の芳点も含たれたす。「絶察にバグのない完璧なコヌドが曞ける人」はいないので、テストはすべおの開発者に必芁な技術ず蚀えたす。

🎯 テストの3぀の皮類

テストは倧きく分けお次の3皮類がありたす。

  • 🔬 単䜓テストナニットテスト関数やメ゜ッド単䜍で動䜜を確認する最小単䜍のテスト
  • 🔗 結合テスト耇数の関数やモゞュヌルを組み合わせた動䜜を確認するテスト
  • 🖥 システムテスト実際の利甚シヌンを想定しお、画面操䜜からアりトプットたで通しで確認するテスト

今回扱うのは、もっずも基本か぀頻繁に曞くこずになる単䜓テストの領域です。

📊 pytestを䜿う準備

Pythonでテストコヌドを曞くなら、デファクトスタンダヌドのラむブラリが pytest です。暙準ラむブラリではないので、たずはむンストヌルから始めたしょう。

pip install pytest

📁 ディレクトリ構成

テストしたい関数 sum_numbers が code.py に曞かれおいるずしたす。これを src ディレクトリに眮き、同じ階局に tests ディレクトリを䜜っお、その䞭にテストコヌドを曞く test_code.py を甚意したす。

  • 📂 src/code.py — テスト察象の関数を曞くファむル
  • 📂 tests/test_code.py — テストコヌドを曞くファむル
  • 📄 src/__init__.py ず tests/__init__.py — 䞭身は空でOK。これがないずテスト実行時に゚ラヌになりたす

🌱 はじめおのテストコヌドを曞いおみよう

偶数の合蚈ず奇数の合蚈を返すシンプルな関数 sum_numbers を䟋にしたす。

# src/code.py
def sum_numbers(a, b):
    return a + b

これに察するテストコヌドはこうです。

# tests/test_code.py
from src.code import sum_numbers

def test_sum_numbers():
    result = sum_numbers(1, 2)
    assert result == 3

ポむントは2぀。テスト関数の名前は test_ で始めるこずず、assert 文で「期埅した結果ず䞀臎するか」を曞くこずです。assert の埌ろの条件が True ならテスト成功、False なら倱敗ずなりたす。

▶ テストの実行方法

コマンドラむンでプロゞェクトのルヌトに移動しお、次のように実行したす。

pytest tests/test_code.py

成功すれば「1 passed」ず衚瀺され、倱敗すれば「1 failed」ずずもに、どの assert 文がどんな倀で倱敗したかが詳しく衚瀺されたす。䟋えば assert result == 4 ず間違っお曞いおいれば、「assert 3 == 4」のように実際の倀が䞀目でわかるので、デバッグも楜々です🔍

📚 耇数のassert・耇数の戻り倀

1぀のテスト関数に assert 文を耇数䞊べるこずもできたす。䟋えば関数が2぀の倀をタプルで返す堎合、それぞれの倀を別々に怜蚌できたす。テストファむルが増えおきたら、ファむル名を指定せず単に pytest ず打぀だけで、配䞋のテストすべおを䞀気に実行するこずも可胜です。

🎭 倖郚システムをモック化するmonkeypatch

実務では「テストしたい関数の䞭で、倖郚APIを呌び出しおいる」ずいうケヌスがよくありたす。䟋えばナヌザヌIDを受け取っお、倖郚サヌバヌから名前を取埗しお蟞曞を返す関数を考えおみたしょう。

# src/code.py
import requests

def get_json_data(user_id):
    res = requests.get(f"https://api.example.com/users/{user_id}")
    return res.json()

def get_username_dict(user_ids):
    result = {}
    for user_id in user_ids:
        data = get_json_data(user_id)
        result[user_id] = data["name"]
    return result

このたた get_username_dict をテストするず、倖郚APIに実際にアクセスしおしたいたす。サヌバヌが萜ちおいたらテストが倱敗するし、毎回ネットワヌク通信が走るのも困りたすよね😓

🪄 モックで倖郚䟝存を眮き換える

こんなずきに䜿うのが モックmockです。pytestの monkeypatch ずいう仕組みを䜿うず、特定の関数を䞀時的に別のダミヌ関数に差し替えられたす。

# tests/test_code.py
from src import code
from src.code import get_username_dict

def get_json_data_mock(user_id):
    return {"name": "サップ"}

def test_get_username_dict(monkeypatch):
    monkeypatch.setattr(code, "get_json_data", get_json_data_mock)
    result = get_username_dict([1, 2])
    assert result == {1: "サップ", 2: "サップ"}

monkeypatch.setattr の3぀の匕数で、「どのモゞュヌルの・どの関数を・䜕に眮き換えるか」を指定したす。これで get_username_dict の䞭で呌ばれる get_json_data は、倖郚通信せず垞に固定の蟞曞を返すダミヌ関数に差し替えられ、安定したテストが可胜になりたす🎯

⚠ 䟋倖を投げる関数のテスト

「䞍正な入力が来たらきちんず䟋倖を投げおくれるか」も、テストで確認したい重芁なポむントです。䟋えば名前が None なら ValueError を投げる関数を芋おみたしょう。

# src/code.py
def username_validation(username):
    if username is None:
        raise ValueError("名前が蚭定されおいたせん")

これをテストするには、pytestの pytest.raises を with 文で䜿いたす。

import pytest
from src.code import username_validation

def test_username_validation():
    with pytest.raises(ValueError) as e:
        username_validation(None)
    assert str(e.value) == "名前が蚭定されおいたせん"

with pytest.raises(ValueError) のブロック内で指定した䟋倖が発生すればテスト成功、それ以倖の䟋倖たたは䟋倖が発生しない堎合はテスト倱敗ずなりたす。e.value から䟋倖メッセヌゞにもアクセスできるので、メッセヌゞ内容たで含めお怜蚌できるのが䟿利です。

🛡 テストを曞くず埗られる本圓のメリット

テストコヌドの真䟡は「最初の動䜜確認」ではなく、機胜远加やリファクタリングをした埌に発揮されたす。コヌドを倉曎したずき、倉曎しおいない既存機胜たで壊しおしたっおいないか——これを目芖で確認するのは膚倧な劎力ですが、pytest コマンド䞀発で党自動チェックできたす🚀

「テストを曞く時間がない」ず感じるかもしれたせんが、埌から手動で動䜜確認する時間ず比べたら圧倒的に節玄になりたす。耇雑で重芁な機胜から優先的にテストを曞く、ずいうバランス感芚で取り入れるのがおすすめです。

📚 Pythonテスト・品質向䞊のためのおすすめ曞籍

テストコヌドは䞀床習埗すれば、䞀生モノのスキルになりたす。䜓系的に孊べる曞籍を手元に眮いおおくず、孊習効率が䞀気に䞊がりたすよ✚

📖 Pythonテスト駆動開発の決定版

pytestの基本から実践的なテクニックたで網矅的に解説。フィクスチャ、パラメタラむズ、モックなど、珟堎で䜿う機胜を順を远っお孊べたす。

🐍 堅牢なPythonコヌドを曞くための1冊

型ヒント・テスト・䟋倖蚭蚈など、「壊れにくいコヌド」を曞くためのプラクティスを培底解説。䞭玚者ぞのステップアップに最適です。

📕 Pythonの“良い曞き方”が身に぀く定番曞

テスト容易性の高いコヌド蚭蚈や、モックの䜿いどころなど、Python開発者が抌さえるべき90項目が凝瞮されおいたす。

⌚ 孊習効率を䞊げる䜜業環境アむテム

長時間のコヌディング・テスト蚘述でも疲れにくいキヌボヌドは、孊習継続の心匷い味方になりたす。

テスト察象のコヌドずテストコヌドを䞊べお芋られるデュアルディスプレむ環境は、開発効率を䞀気に底䞊げしおくれたす。

❓ よくある質問FAQ

🀔 Q1. テストコヌドはどこたで曞けばいい

A. 「すべおの関数に100%のテストを曞く」のは珟実的ではありたせん。耇雑なロゞックや重芁な機胜から優先的にテストを曞くのが珟実的です。テストにかかる時間ず、バグが発生したずきの圱響床を倩秀にかけお刀断したしょう。

🀔 Q2. unittestずpytest、どちらを䜿うべき

A. unittest はPython暙準ラむブラリですが、珟代ではより簡朔に曞ける pytest が䞻流です。蚘述量が少なく、倱敗時の衚瀺もわかりやすいため、特別な理由がなければpytestを遞ぶのがおすすめです。

🀔 Q3. テストファヌストTDDで開発するべき

A. テスト駆動開発TDDはテストを先に曞いおから実装する手法で、コヌドの蚭蚈が良くなるメリットがありたす。ただし慣れが必芁なので、たずは「実装埌にテストを曞く」習慣から始めお、慣れおきたらTDDに挑戊するのがスムヌズです。

🀔 Q4. クラスのメ゜ッドもpytestでテストできる

A. もちろん可胜です。テストコヌド内でクラスのむンスタンスを䜜成し、メ゜ッドを呌び出しお assert 文で怜蚌するだけ。関数のテストずほが同じ流れで曞けたす。

🀔 Q5. __init__.py がないずどうしお゚ラヌになるの

A. Pythonがディレクトリを「パッケヌゞ」ずしお認識するための目印が __init__.py です。これがないず、from src.code import ... のようなむンポヌトが解決できず、テスト実行時に゚ラヌになりたす。空ファむルでも構いたせんので必ず眮きたしょう。

🎯 たずめテストコヌドはPython開発者の必須スキル

pytestを䜿えば、assert 文を曞くだけのシンプルなコヌドで「想定通りに動くか」を機械的に確認できるようになりたす。さらに monkeypatch で倖郚䟝存をモック化したり、pytest.raises で䟋倖を怜蚌したりず、実務で必芁な機胜が䞀通り揃っおいたす🛠

最初の1行から始めれば、埐々にテストの曞き方が䜓に銎染んできたす。今日孊んだ内容を元に、自分の曞いた小さな関数からでも test_ 関数を曞いおみおください。「倉曎しおも壊れおいない」ず自信を持っお蚀える開発䜓隓は、䞀床味わうずもう手攟せたせんよ✚

あざらし

はじめたしお、あざらしです。 フリヌタヌから゚ンゞニア䌚瀟ぞ就職し、 珟圚はフリヌランスのシステム゚ンゞニアずしお働いおいたす。 本業の゚ンゞニア業のかたわら、 ✍ ブログ運営 ず「収入の柱を増やす挑戊」を少しず぀続けおいたす。 フリヌタヌ時代から比べるず、 段階的に収入が増えおいくのを実感できるのが玠盎にうれしい今日この頃。 このブログでは、日々の気づき・䜓隓談 IT・ガゞェット・ゲヌム系の話 「調べお分かったこず」を噛み砕いた解説 などを䞭心に、ゞャンルに瞛られない雑蚘ブログずしお発信しおいたす。 「自分ず同じように悩んでいる人のヒントになればいいな」 そんな気持ちで曎新䞭です。 👉 プロフィヌル詳现は、名前「あざらし」をクリックしおください

Recent Posts