スポンサーリンク

Pythonでテストコードを書く方法|初心者向けpytest入門ガイド

Python入門
  1. 1. はじめに|Pythonの「テストコード」ってなに?
  2. 2. テストコードってなぜ必要なの?
    1. 🧪 テストコードがあるとどうなる?
    2. 🧩 テストの種類はいろいろあるよ
  3. 3. pytestとは?インストールと基本の使い方
    1. 🔧 pytestってどんなツール?
    2. 🧰 まずはインストールしよう!
    3. 🧪 最初のテストを書いてみよう!
      1. ① プログラムファイルを作る
      2. ② テスト用のファイルを作る
    4. ▶ テストを実行してみよう!
    5. 💡 テストファイルが複数ある場合は?
  4. 4. プロジェクト構成とテスト関数の書き方
    1. 🗂️ プロジェクト構成の基本スタイル
    2. 🖋️ テスト関数の基本の書き方
      1. ✔ テスト関数のルールまとめ:
    3. 🎯 複数のケースをテストしたいときは?
    4. 🧪 テスト関数が増えても大丈夫!
  5. 5. クラスやメソッドのテストの書き方
    1. 🧪 クラスのテストを書く基本パターン
    2. ✅ テストを実行してみよう!
    3. 💡 ちょっと便利な書き方:共通のセットアップ
  6. 6. 応用①:モックを使って外部依存を切り離す方法
    1. 🧸 モックってなに?
    2. 🔄 monkeypatchで関数を置き換える方法
      1. 🎯 テスト対象のコード(本体)
      2. 🧪 モックを使ったテストコード
    3. 📌 ポイントまとめ
  7. 7. 応用②:例外処理のテスト方法
    1. ❗ 例外のテストってどうやるの?
    2. 💥 例:エラーを出す関数のテスト
      1. ✅ テスト対象の関数
      2. 🧪 テストコード
    3. 🧩 補足:as eってなに?
    4. ✅ 例外が出なかった or 違う例外だったら?
  8. 8. テストコードを書くことで得られるメリット
    1. ✅ メリット①:コードを直しても安心!
    2. ✅ メリット②:バグにすぐ気づける!
    3. ✅ メリット③:人にコードを共有しやすくなる!
    4. ✅ メリット④:将来の自分に優しい!
    5. 🧪 テストコードは「未来の自分へのプレゼント」
  9. 9. まとめ|テストは面倒だけど、未来の自分の味方!
    1. 🧪 テストコードの要点をおさらい!
    2. 💡 テストを書くと、コードに自信が持てる!
    3. 🎁 テストコードは未来の自分へのプレゼント
    4. 🔗 あわせて読みたい
  10. よくある質問(Q&A)
    1. 関連投稿:

1. はじめに|Pythonの「テストコード」ってなに?

こんにちは!
この記事では、Pythonでテストコードを書く方法を、初心者にもわかりやすく紹介していきます。
「テストコードって聞いたことあるけど、自分にはまだ関係なさそう…」と思っている方も多いかもしれません。でも実は、プログラムをちゃんと動かすために超大事なものなんです!

たとえばこんなこと、経験ありませんか?

  • せっかく書いたプログラムが、ちょっと変えたら動かなくなった…
  • 前はうまくいってたのに、どこかの修正が原因でバグが発生した…
  • チームでコードを共有してたら、他の人の変更で自分の処理が壊れてた…

こういったトラブルを未然に防ぐのが「テストコード」の役割です。
「自動でプログラムをチェックしてくれるお守り」みたいな存在ですね!

この記事では、Pythonでのテストライブラリ「pytest(パイテスト)」を使って、こんなことができるようになります:

  • 関数やクラスが「ちゃんと動いているか」を自動でチェック
  • もしエラーが出たら、どこがおかしいかを表示してくれる
  • プログラムを変更しても、「元の機能が壊れていないか」をすぐに確認できる

しかも、テストコードは数行のシンプルなコードで書けるので、初心者の方でもすぐに実践できます。




2. テストコードってなぜ必要なの?

「自分の書いたコード、ちゃんと動いてるし問題ないでしょ!」
…そう思っていても、実はうっかりミスや予想外のバグって、すごく起きやすいんです。

たとえば…

  • 計算アプリで「消費税を含めた合計金額」を出す関数を書いたつもりが、税率のかけ方を間違えてた!
  • データベースに保存する処理を書いたけど、保存できていなかった!
  • 変数の初期化を忘れて、エラーが出た!

こういう問題は、見た目ではわかりづらいし、気づきにくいんです。
しかも、コードを少しでも変更すると、「今まで動いてた処理」が突然壊れることもよくあります。


🧪 テストコードがあるとどうなる?

テストコードをしっかり書いておくと、こんなメリットがあります:

✅ プログラムを変更しても、壊れていないか自動で確認できる
✅ 複数人で開発しても、動作確認の基準が統一される
✅ 手動でいちいち確認しなくていいので、時間の節約になる
✅ 「いつ壊れたのか」「どこでバグが出たのか」がすぐわかる

しかも、pytestを使えば、コマンド1つで全部のテストを一気に実行できます。
まるで「コードのお医者さん」みたいに、健康診断をしてくれるんです!


🧩 テストの種類はいろいろあるよ

テストにはいくつかの種類がありますが、ここでは特に重要な3つを紹介します:

テストの種類内容
単体テスト(Unit Test)関数やメソッドなど、ひとつひとつの部品が正しく動くかチェック
結合テスト(Integration Test)複数の機能を組み合わせて、一連の流れがうまくいくか確認
システムテスト(System Test)全体としてアプリやシステムがちゃんと使えるかを確認

この記事では、まず「単体テスト」について、pytestを使って学んでいきます!

「動くコード」じゃなく、「壊れないコード」を書こう!
テストコードを書くことは、自分の未来を楽にする最高の習慣です✨




3. pytestとは?インストールと基本の使い方

テストコードを書こう!と思っても、いきなり「どうやって書けばいいの?」ってなりますよね。
ここで登場するのが、Pythonで人気のテストツール**「pytest(パイテスト)」**です!


🔧 pytestってどんなツール?

pytestは、Pythonのコードに対してテストを簡単に書いて、簡単に実行できるライブラリです。
とてもシンプルに使えるので、初心者にもおすすめ!

たとえばこんな風に使います:

# テスト対象の関数(例)
def add(a, b):
return a + b

# テストコード(test_で始めるのがルール!)
def test_add():
assert add(2, 3) == 5

このコードをpytestで実行すると、「add(2, 3)がちゃんと5になるか?」を自動でチェックしてくれます!


🧰 まずはインストールしよう!

pytestはPythonの標準ライブラリではないので、事前にインストールが必要です。
以下のコマンドをターミナル(またはコマンドプロンプト)で実行してください。

pip install pytest

これで準備完了!✨


🧪 最初のテストを書いてみよう!

① プログラムファイルを作る

たとえば source/code.py にこんな関数を書きます:

def add(a, b):
return a + b

② テスト用のファイルを作る

tests/test_code.py という名前でファイルを作り、次のように書きます:

from source import code

def test_add():
result = code.add(2, 3)
assert result == 5

ポイント:

  • テスト関数の名前は「test_〜」で始めること(これがルールです)
  • assertで、「期待する値と同じかどうか」をチェックします

▶ テストを実行してみよう!

ターミナルで、testsフォルダに移動してこのコマンドを打ちます:

pytest test_code.py

すると、こんな表示が出るはずです:

==================== test session starts ====================
collected 1 item

test_code.py . [100%]

==================== 1 passed in 0.02s ======================

1 passed」と表示されたら、テスト成功です!やったね!


💡 テストファイルが複数ある場合は?

テストファイルをいちいち指定しなくても、こう書くだけでOK:

pytest

これで、testsフォルダ内にあるすべてのテストがまとめて実行されます。

「ちょっとしたチェックでも、pytestに任せてラクしよう!」
テストが習慣になると、コードの信頼性がグッとアップしますよ!




4. プロジェクト構成とテスト関数の書き方

pytestでテストを書けるようになってきたら、次は「実際のプロジェクトでの使い方」も知っておきたいところ。
ここでは、よくあるフォルダ構成や、テスト関数の作り方をわかりやすく紹介します!


🗂️ プロジェクト構成の基本スタイル

以下のようなシンプルなディレクトリ構成がおすすめです:

project/
├── source/
│ └── code.py ← テスト対象の本体コード
├── tests/
│ ├── test_code.py ← テストコード
│ └── __init__.py ← 空でもOK。testsをPythonパッケージにするために必要

ポイントは:

  • 本体コード(source)とテストコード(tests)を分けて管理
  • testsフォルダの中には、必ず __init__.py ファイルを置く
    • 中身は空でOK!
    • これがないと pytest がモジュールを読み込めなくてエラーになることがあります

🖋️ テスト関数の基本の書き方

テストファイル(たとえば test_code.py)には、次のように書いていきます。

from source import code  # テスト対象のモジュールをインポート

def test_add():
result = code.add(1, 2)
assert result == 3

✔ テスト関数のルールまとめ:

ルール内容
関数名は test_ から始めるこれがないと pytest に無視されちゃいます
assert を使って結果を検証条件が True なら合格!失敗するとどこがダメか表示されます
1つの関数につき1つのテストが基本テスト数=関数の数でカウントされます

🎯 複数のケースをテストしたいときは?

1つの関数に対して、複数の入力パターンを試したい場合もありますよね。
そんなときは、assertを複数書いてもOKです:

def test_add():
assert code.add(1, 2) == 3
assert code.add(0, 0) == 0
assert code.add(-1, 1) == 0

もちろん、個別のテスト関数に分けてもOKです。好みに応じて使い分けましょう。


🧪 テスト関数が増えても大丈夫!

関数やファイルが増えても、pytestは自動的にすべてのtest_関数を検出して実行してくれます。

pytest

と打つだけで、すべてのテストがまとめて実行されて、どこがOKでどこがNGかすぐにわかります!

✅ テストの基本は「test_〜」という名前で、assertで比べるだけ!
難しそうに見えるけど、書き方のルールはとてもシンプルなんです!




5. クラスやメソッドのテストの書き方

ここまでは「関数」に対するテストを書いてきましたが、実際のプログラムではクラスを使うこともよくありますよね。

たとえば、次のような「計算機クラス」があったとします:

# source/calculator.py

class Calculator:
def add(self, a, b):
return a + b

def subtract(self, a, b):
return a - b

このようなクラスのメソッドをテストするのも、実はとっても簡単なんです!


🧪 クラスのテストを書く基本パターン

クラスのテストでは、「オブジェクト(インスタンス)を作ってからメソッドを呼び出す」だけ!
以下のようにテストを書きます:

# tests/test_calculator.py

from source.calculator import Calculator

def test_add():
calc = Calculator()
assert calc.add(2, 3) == 5

def test_subtract():
calc = Calculator()
assert calc.subtract(5, 2) == 3

ポイントはこの2つ:

✅ クラスを使うときは、テスト関数の中でインスタンスを作る
✅ あとは普通の関数と同じように、assertで結果をチェック


✅ テストを実行してみよう!

ファイルを保存したら、コマンドで実行してみましょう:

pytest tests/test_calculator.py

テストが通れば、次のように表示されます!

================= test session starts =================
collected 2 items

test_calculator.py .. [100%]

================= 2 passed in 0.01s ==================

.(ドット)」は1つのテストが成功した印。ドットが並ぶほど、ちゃんと動いているということです!


💡 ちょっと便利な書き方:共通のセットアップ

もし同じクラスを毎回作って使うなら、「setup_function」を使って共通化することもできます:

# tests/test_calculator.py

from source.calculator import Calculator

def setup_function():
global calc
calc = Calculator()

def test_add():
assert calc.add(1, 1) == 2

def test_subtract():
assert calc.subtract(3, 1) == 2

このようにすれば、各テスト関数の中でいちいちインスタンスを作る必要がなくなります。

💬 まとめ:クラスのテストも「いつも通り」でOK!
クラスも関数も、テストの書き方はほとんど同じなので怖がらずにチャレンジしてみましょう!




6. 応用①:モックを使って外部依存を切り離す方法

ここからはちょっとステップアップ!
実際の開発では、「他の関数」や「外部サービス」に依存している処理をテストする場面も出てきます。

たとえば…

  • Web APIからデータを取得する関数
  • データベースにアクセスする関数
  • 時間や環境に依存するような処理

こういう場合、「本物の外部処理を呼び出さずにテストしたい!」ということがありますよね。
そこで使うのが モック(Mock) です。


🧸 モックってなに?

モックとは、**本物の関数の代わりに使う“にせもの関数”**のこと。

本物の関数の代わりに「こういう値を返してね」とあらかじめ決めておけば、外部サービスを使わなくても安心してテストできます!


🔄 monkeypatchで関数を置き換える方法

Pythonのpytestには、関数を差し替えるための便利な機能monkeypatch」があります。
以下のように使います:

🎯 テスト対象のコード(本体)

# source/code.py

def get_json_data():
# 実際にはWeb APIなどにアクセスする関数
return {"users": ["Alice", "Bob", "Charlie"]}

def get_usernames():
data = get_json_data()
return data["users"]

🧪 モックを使ったテストコード

# tests/test_code.py

from source import code

def test_get_usernames(monkeypatch):
# モック関数を定義
def mock_get_json_data():
return {"users": ["TestUser1", "TestUser2"]}

# モック関数で本物を置き換える
monkeypatch.setattr(code, "get_json_data", mock_get_json_data)

result = code.get_usernames()
assert result == ["TestUser1", "TestUser2"]

📌 ポイントまとめ

項目内容
monkeypatchpytestが提供する「関数の差し替えツール」
.setattr()の第1引数差し替えたい関数があるモジュール名
第2引数差し替えたい関数名(文字列)
第3引数実際に使うモック関数

💬 モックを使えば、ネットに繋がなくても安心してテストできる!
外部とのやりとりが絡む処理は、ぜひモックを活用しましょう。




7. 応用②:例外処理のテスト方法

プログラムを書いていると、「エラーをあえて発生させる」ことってありますよね。

たとえば…

  • 入力が空だったら ValueError を出す
  • ファイルが見つからなければ FileNotFoundError を出す
  • ユーザーが存在しない場合は例外にする

こういう**「意図的なエラー(例外)」がちゃんと発生するか?**も、テストで確認できます!


❗ 例外のテストってどうやるの?

pytestでは、例外が起きることを確認するための専用の書き方があります。

それがこちら:

with pytest.raises(期待する例外の型):
エラーが発生するはずの処理

この書き方を使うと、「この処理で○○という例外が発生すること」をチェックできます!


💥 例:エラーを出す関数のテスト

✅ テスト対象の関数

# source/user.py

def get_user_name(user_id):
if user_id is None:
raise ValueError("ユーザーIDが設定されていません")
return f"user_{user_id}"

🧪 テストコード

# tests/test_user.py

import pytest
from source import user

def test_get_user_name_with_none():
with pytest.raises(ValueError) as e:
user.get_user_name(None)

# エラーメッセージも確認したいとき
assert str(e.value) == "ユーザーIDが設定されていません"

🧩 補足:as eってなに?

pytest.raises() で捕まえた例外情報を as e で変数に入れることで、

str(e.value)

のようにして、エラーメッセージの中身までテストできます。


✅ 例外が出なかった or 違う例外だったら?

このテストが失敗するパターンは2つ:

失敗パターン
エラーが発生しなかったraise文が抜けてた、条件が間違ってた
指定と違う型のエラーが出たTypeErrorを想定してたのにValueErrorが出た、など

これらの場合、pytestがきちんとエラーメッセージで知らせてくれるので、原因をすぐ特定できます!

💬 「ちゃんとエラーが出る」ことも、プログラムの正しさのひとつ!
安全なコードのためには、例外処理もテストしておくと安心ですね。




8. テストコードを書くことで得られるメリット

ここまで読んでくださったあなたは、もうテストコードの基本がしっかりわかってきたはず!
「でもやっぱり、書くのちょっと面倒だな…」って思いますよね。

…正直、その気持ち、わかります!笑

でも!
テストコードを書いておくと、あとでめちゃくちゃ自分がラクになるんです!
ここではその「メリット」をわかりやすく紹介します。


✅ メリット①:コードを直しても安心!

プログラムを修正したあと、「あれ?他の機能に影響ないかな…?」と不安になること、ありませんか?

そんなときも、テストコードがあれば…

pytest

この一行で、すべての機能が壊れていないか一発でチェックできます!


✅ メリット②:バグにすぐ気づける!

「なんかおかしい…」と思ったら、すぐにテストを実行!
失敗した部分が詳しく表示されるので、どこにバグがあるか一目瞭然です。


✅ メリット③:人にコードを共有しやすくなる!

チーム開発や公開用ライブラリを作るとき、**「このコードはテストで確認済みです!」**って言えるのは超強い武器。

「安心して使ってください!」と言えるし、他の人が変更してもテストですぐわかるので、トラブルも防げます。


✅ メリット④:将来の自分に優しい!

数ヶ月後にコードを見たとき、「これ、どう動くんだっけ?」ってなること、絶対あります。

そんなときも、テストコードを見ればすぐに思い出せますし、「動いてるかどうか」を毎回確認しなくていいんです。


🧪 テストコードは「未来の自分へのプレゼント」

テストコードを書くのはたしかにちょっと手間かもしれません。
でもそのおかげで、あとから何度も助けられることになります。

pytest

この一言で、「全部チェックしてくれる」って、本当にすごいことなんです!

💬 書いたその日から、ずっと役立つ。それがテストコード!
ぜひ、今日からちょっとずつテストを書く習慣を始めてみてください😊




9. まとめ|テストは面倒だけど、未来の自分の味方!

ここまでお読みいただき、本当にありがとうございます!
Pythonのテストコード、最初は「ちょっと難しそう…」と感じたかもしれませんが、やってみると意外とシンプルだったのではないでしょうか?


🧪 テストコードの要点をおさらい!

  • テストはバグを未然に防ぐための「お守り」
  • pytestを使えば、簡単なコードでテストが書ける
  • test_〜で始まる関数にassertを書く、それだけでOK!
  • 関数だけでなく、クラスのメソッドや例外処理の確認も可能
  • monkeypatchを使えば、外部依存のある処理もモック化できる

💡 テストを書くと、コードに自信が持てる!

「ちゃんと動くかな?」とビクビクすることがなくなり、
「これだけ書き換えても、テスト通ってるから大丈夫!」という安心感が手に入ります。

しかも、ちょっとした変更でも

pytest

このコマンドひとつで、全部まとめてチェックできるのが最高!


🎁 テストコードは未来の自分へのプレゼント

今ちょっとだけ頑張って書いておけば、あとで

  • デバッグの手間が減る
  • 修正が怖くなくなる
  • チーム開発もスムーズになる

という、大きなメリットが手に入ります。

💬 「動くコード」よりも「壊れにくいコード」を目指そう!
そしてそれを支えてくれるのが、テストコードです。


🔗 あわせて読みたい

Pythonでテストコードに関心を持ったあなたに、あわせて読んでほしい関連記事はこちら!


よくある質問(Q&A)

Q
テスト関数の中でprint()を使ってもいいですか?
A

はい、使っても構いません。ただしpytestassertを使って結果を判定するので、printデバッグ用として使いましょう。

Q
pytestを毎回手動で実行するのは面倒なんだけど…
A

そんなときは、GitHub ActionsなどのCIツールと連携して、自動実行させることもできます。

Q
失敗したテストだけを実行する方法はありますか?
A

はい、以下のようにすればOKです:

pytest --lf

これで「前回失敗したテストだけ」を再実行できます!

※当サイトはアフィリエイト広告を利用しています。リンクを経由して商品を購入された場合、当サイトに報酬が発生することがあります。

※本記事に記載しているAmazon商品情報(価格、在庫状況、割引、配送条件など)は、執筆時点のAmazon.co.jp上の情報に基づいています。
最新の価格・在庫・配送条件などの詳細は、Amazonの商品ページをご確認ください。

スポンサーリンク