最近Pythonでユニットテストの勉強をしたので備忘録も兼ねて簡単に記事にしておく
実行環境
- Python 3.5.1
ライブラリ
今回Pythonでユニットテストを行うにあたってunittestというライブラリを使用する。
unittestは標準でインストールされているライブラリのためpipでインストールする必要がなく非常にお手軽である。
実践
まずはこの簡単な足し算のプログラムをテストする。
def add(a, b):
return a + b
テストするプログラムはこんな感じ
import unittest
from Math import *
class TestMath(unittest.TestCase):
def test_add(self):
value1 = 2
value2 = 6
expected = 8
actual = add(value1, value2)
self.assertEqual(expected, actual)
if __name__ == "__main__":
unittest.main()
手順
-
import unittest
でunittest
を読み込みます。 -
unittest.TestCase
を継承したクラスを作成します。 - テストを行う関数を定義します。
-
unittest.main()
でテストを実行します。
実行
$ python test_math.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
テストが成功するとこのように表示されます。
テストの前後に処理を行う
それぞれのユニットテストを行うにあたってテストの前後に処理を挟みたい時があります。
unittest
にはそのためのメソッドが用意されており、ユニットテスト開始前に実行されるメソッドはsetUp()
、終了時に実行されるメソッドはtearDown()
が使用できます。
実際に実行して見ましょう。
def add(a, b):
return a + b
def sub(a, b):
return a - b
先ほどのmath.py
にsub(引き算)メソッドを追加しました。
add()
とsub()
を一つのテストクラスで実行した場合に、それぞれのユニットテスト実行前後に処理を挟めるようにして見ましょう。
import unittest
from Math import *
class TestMath(unittest.TestCase):
def setUp(self):
print("setup!")
def test_add(self):
print("add!")
value1 = 2
value2 = 6
expected = 8
actual = add(value1, value2)
self.assertEqual(expected, actual)
def test_sub(self):
print("sub!")
value1 = 6
value2 = 2
expected = 4
actual = sub(value1, value2)
self.assertEqual(expected, actual)
def tearDown(self):
print("teardown!\n")
if __name__ == "__main__":
unittest.main()
これを実行してやると下記のようになります。
setup!
add!
teardown!
.setup!
sub!
teardown!
.
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
上手くそれぞれのユニットテストの前後に処理が挟まれました。
まとめて実行
テストモジュールが大量に存在する場合に、いちいち全てを叩いてテストしていてはキリがないので、unittest
にはまとめて実行できる機能が用意されている。
$ python -m unittest discover
上記のようにdiscover
を使ってやればテストモジュールを一気に実行してくれます。
最後に
今回は同じ値だった場合にOKを返すassertEqual()
メソッドを使いましたが、他にも値が一致しない場合にOKを返すassertNotEqual()
メソッドなど様々のものがあります。詳しくは公式のドキュメントを参照してください。