「自分で書いた関数が本当に正しく動いているのか、毎回 print で確認している」という方は多いのではないでしょうか。テストコードを書くと、その確認を自動化でき、あとでコードを直したときの安心感がまったく違います。
この記事では、Pythonの標準ライブラリ unittest を使って、テストを書いて実行する方法を初心者向けに解説します。assert 文から始めて、よく使う検証メソッド、例外のテストまでを順番に見ていきましょう。
テストコードとは?
テストコードとは、「この入力ならこの結果になるはず」という期待を、プログラムとして書いたものです。実行するたびに期待どおりか自動で判定してくれるので、修正のたびに手作業で確認する必要がなくなります。
まずは assert 文でチェックしてみる
def add(a, b):
return a + b
assert add(1, 2) == 3
assert add(-1, 1) == 0
print("OK") # OKassert は、条件が True なら何も起きず、False なら AssertionError で止まる仕組みです。とても手軽ですが、失敗したときにどこで落ちたか分かりにくい、複数のテストをまとめて実行しにくい、といった弱点があります。
unittest の基本の書き方
unittest では、テスト用のクラスを作り、test_ で始まる名前のメソッドにテスト内容を書きます。次のファイルを test_calc.py として保存しましょう。クラスの書き方はPythonのクラスの基本で解説しています。
import unittest
def add(a, b):
return a + b
class TestAdd(unittest.TestCase):
def test_add_positive(self):
self.assertEqual(add(1, 2), 3)
def test_add_negative(self):
self.assertEqual(add(-1, -2), -3)
def test_add_zero(self):
self.assertEqual(add(0, 0), 0)
if __name__ == "__main__":
unittest.main()ターミナルで python test_calc.py と実行すると、次のように結果が表示されます。
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK「.」ひとつが成功したテスト1件を表します。失敗すると F が表示され、どこで何が違ったかが詳しく出力されます。
よく使う検証メソッド
- assertEqual(a, b):a と b が等しい
- assertNotEqual(a, b):a と b が等しくない
- assertTrue(x) / assertFalse(x):x が True / False
- assertIn(a, b):a が b に含まれる
- assertIsNone(x):x が None
- assertAlmostEqual(a, b):小数がほぼ等しい
小数の計算は誤差が出るため、assertEqual ではなく assertAlmostEqual を使うのがポイントです。
import unittest
class TestFloat(unittest.TestCase):
def test_float(self):
self.assertAlmostEqual(0.1 + 0.2, 0.3)
if __name__ == "__main__":
unittest.main()テストの書き方や設計は、現場でも評価されやすいスキルです。仕事につなげたい方は、プログラミングスクールの選び方と比較軸もあわせて確認してみてください。
例外が出ることをテストする
「0で割ったらエラーになること」のように、例外が発生することをテストしたい場合は assertRaises を使います。例外処理の基本はtry-exceptの記事で確認できます。
import unittest
def divide(a, b):
return a / b
class TestDivide(unittest.TestCase):
def test_divide(self):
self.assertEqual(divide(10, 2), 5)
def test_divide_by_zero(self):
with self.assertRaises(ZeroDivisionError):
divide(1, 0)
if __name__ == "__main__":
unittest.main()テストの前処理:setUp
import unittest
class TestList(unittest.TestCase):
def setUp(self):
# 各テストの前に毎回呼ばれる
self.items = [1, 2, 3]
def test_length(self):
self.assertEqual(len(self.items), 3)
def test_append(self):
self.items.append(4)
self.assertEqual(self.items, [1, 2, 3, 4])
if __name__ == "__main__":
unittest.main()setUp は各テストの直前に実行されるので、テスト同士が影響し合いません。テストごとにまっさらな状態から始められます。
もっと効率的にPythonを学びたい人へ
テストコードは、実務でコードを書くうえで欠かせないスキルです。レビューを受けながら書き方を身につけたい方は、マンツーマン指導のスクールを検討してみてください。
Winスクールの「Python Winner」は、マンツーマン指導で未経験からPythonを学べ、転職サポートや無料カウンセリングにも対応しています。まずは無料カウンセリングで、自分に合うか確かめてみてはいかがでしょうか。
※本記事には広告(アフィリエイトリンク)を含みます。
Pythonプログラミング|マンツーマンレッスンで初めてをプロに育てる【Python Winner】![]()
他のスクールとも比べたい方は、スクールの比較記事もあわせてご覧ください。資格取得を目指す方はPython3エンジニア認定基礎試験の参考書比較も参考になります。
まとめ
- テストコードは「期待する結果」を自動で確認する仕組み
- 手軽なチェックなら assert、本格的には unittest を使う
- テスト用クラスを作り、test_ で始まるメソッドに書く
- assertEqual・assertTrue・assertIn・assertAlmostEqual などを使い分ける
- 例外は assertRaises、前処理は setUp で書く
まずは自分が書いた小さな関数に、3つほどテストを書いてみましょう。
ナノトイラボ 
