パイソンでユニットテストをしてみよう

ユニットテスト(Unit Test:単体テスト)とは、小さな部品のような関数が設計した通りに動くか確認する方法になります。

ユニットテストをすることで、自身で書いたコードの理解が深まったり、より確実に動くコードにしていくことが出来ます。


始めに簡単な足し算を行う関数が書かれたファイルを作成します。

~/buhin.py

def tasu(a, b):
␣␣␣␣return a + b

※␣は半角スペース1個分

2つの数字を足す(tasu)という関数を用意しました。


続いて、ユニットテスト用のファイルを作成します。

今回はbuhin.pyのテストで有ることがわかりやすくなるようにtest_buhin.pyというファイル名にします。


~/test_buhin.py

import unittest
from buhin import tasu


class TestTasu(unittest.TestCase):

␣␣␣␣def test_tasu(self):
␣␣␣␣␣␣␣␣suji1 = 5
␣␣␣␣␣␣␣␣suji2 = 3
␣␣␣␣␣␣␣␣seikai = 8
␣␣␣␣␣␣␣␣kekka = tasu(suji1, suji2)
␣␣␣␣␣␣␣␣self.assertEqual(seikai, kekka)


if __name__ == "__main__":
␣␣␣␣unittest.main()

※␣は半角スペース1個分


ユニットテストを行うファイルの場合はimport unittestの一行を必ず挿入しておきます。


from buhin import tasu

buhin.pyからtasuという関数のみ使用できるようにするという命令になります。


class TestTasu(unittest.TestCase):

クラス名はクラス名の後の括弧で指定する親クラスがunittest.TestCaseであれば名前は何でも良いので、わかりやすいクラス名を決めましょう。


今回、tasuという関数のユニットテストを作りたいので、テスト用で設けたクラスのメソットに、

def test_tasu(self):

のように関数名の頭にtest_を付けたメソッドを用意します。

※クラスメソッドの名前は頭にtestが付いていれば何でも良いです

※test_tasuはクラスメソッドなので、引数には必ずselfを入れておきます。


class TestTasu(unittest.TestCase):

␣␣␣␣def test_tasu(self):
␣␣␣␣␣␣␣␣suji1 = 5
␣␣␣␣␣␣␣␣suji2 = 3
␣␣␣␣␣␣␣␣seikai = 8
␣␣␣␣␣␣␣␣kekka = tasu(suji1, suji2)
␣␣␣␣␣␣␣␣self.assertEqual(seikai, kekka)

※␣は半角スペース1個分


ユニットテストを書く場合は、期待する結果(今回はseikaiという変数名)を必ず用意しておき、テスト用メソッド内でテストしたい関数を実行し、その結果を

self.assertEqual(seikai, kekka)

のようにして、期待する結果と実際の結果が一致するか?を確認します。


if __name__ == "__main__":
␣␣␣␣unittest.main()

※␣は半角スペース1個分

最後の行で

$ python3 ~/test_buhin.py

が実行出来るようにしておきます。




テストを実行してみます。

今回は期待する結果(seikai)と実際の結果(kekka)が一致するようにしていますので、ユニットテストの実行結果は

.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

になります。




テストコードを下記のように書き換えてみます。

class TestTasu(unittest.TestCase):

␣␣␣␣def test_tasu(self):
␣␣␣␣␣␣␣␣suji1 = 5
␣␣␣␣␣␣␣␣suji2 = 3
␣␣␣␣␣␣␣␣seikai = 7
␣␣␣␣␣␣␣␣kekka = tasu(suji1, suji2)
␣␣␣␣␣␣␣␣self.assertEqual(seikai, kekka)

※␣は半角スペース1個分

期待する結果(seikai)と実際の結果(kekka)が一致しないパターンです。


このテストコードを実行してみると、

F
======================================================================
FAIL: test_tasu (__main__.TestBuhin.test_tasu)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/pi/test_buhin.py", line 12, in test_tasu
    self.assertEqual(seikai, kekka)
AssertionError: 7 != 8

----------------------------------------------------------------------
Ran 1 test in 0.001s

FAILED (failures=1)

のような結果になりました。


関数を作成する度にユニットテストを作成していく事で、綺麗なコードへと仕上がっていきます。

unittest --- ユニットテストフレームワーク — Python 3.13.3 ドキュメント

同じカテゴリーの記事
マインクラフト用ビジュアルエディタを開発しています。

詳しくはinunosinsi/mcws_blockly - githubをご覧ください。