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"]
📌 ポイントまとめ
| 項目 | 内容 |
|---|---|
monkeypatch | pytestが提供する「関数の差し替えツール」 |
.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でテストコードに関心を持ったあなたに、あわせて読んでほしい関連記事はこちら!
- 【Python入門】自作モジュールの作り方と使い方を初心者向けにやさしく解説!
┗ テスト対象の関数をモジュール化して整理したい人におすすめ! - 【Python入門】引数のデフォルト値とタイプアノテーションの使い方をやさしく解説!
┗ テスト時に関数の引数で混乱しやすい人はこちらで整理! - 【Python入門】クラス入門ガイド|オブジェクト指向をやさしく解説
┗ クラスとメソッドのテストを書きたい人は、クラス自体の基礎をここで復習!
よくある質問(Q&A)
- Qテスト関数の中で
print()を使ってもいいですか? - A
はい、使っても構いません。ただし
pytestはassertを使って結果を判定するので、printはデバッグ用として使いましょう。
- Q
pytestを毎回手動で実行するのは面倒なんだけど… - A
そんなときは、GitHub ActionsなどのCIツールと連携して、自動実行させることもできます。
- Q失敗したテストだけを実行する方法はありますか?
- A
はい、以下のようにすればOKです:
pytest --lfこれで「前回失敗したテストだけ」を再実行できます!







※当サイトはアフィリエイト広告を利用しています。リンクを経由して商品を購入された場合、当サイトに報酬が発生することがあります。
※本記事に記載しているAmazon商品情報(価格、在庫状況、割引、配送条件など)は、執筆時点のAmazon.co.jp上の情報に基づいています。
最新の価格・在庫・配送条件などの詳細は、Amazonの商品ページをご確認ください。