【Python】unittestの使い方を初心者向けに解説!テストコードの書き方と実行方法

関数の動作確認を自動化するテストコードを解説

※このサイトの記事内では広告を掲載している場合があります。

「自分で書いた関数が本当に正しく動いているのか、毎回 print で確認している」という方は多いのではないでしょうか。テストコードを書くと、その確認を自動化でき、あとでコードを直したときの安心感がまったく違います。

この記事では、Pythonの標準ライブラリ unittest を使って、テストを書いて実行する方法を初心者向けに解説します。assert 文から始めて、よく使う検証メソッド、例外のテストまでを順番に見ていきましょう。

テストコードとは?

テストコードとは、「この入力ならこの結果になるはず」という期待を、プログラムとして書いたものです。実行するたびに期待どおりか自動で判定してくれるので、修正のたびに手作業で確認する必要がなくなります。

まずは assert 文でチェックしてみる

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


assert add(1, 2) == 3
assert add(-1, 1) == 0
print("OK")  # OK

assert は、条件が 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つほどテストを書いてみましょう。

コメントを残す

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

CAPTCHA