概要
Pythonのユニットテストの手法について、下記の3つのライブラリを用いて、3回に分けて紹介します。
今回は、unittestについて紹介します。
UnitTest
公式サイトによると、「unittest は元々 JUnit に触発されたもので、 他の言語の主要なユニットテストフレームワークと同じような感じです。」と書いてあります。Pythonをインストールした時点で利用可能になっているので、第三者のライブラリをインストールする必要がありません。Pythonの環境さえあれば、簡単に検証ができます。
基本的にunittestは、以下の順に書きます
- unittestライブラリをインポートする
- unittest.TestCaseを継承したクラスを作る
- 上記で作ったクラスに、テストケースを記述したメソッドを作る
- 上記で作ったメソッドの中にテストケースを書く
- unittest.main()でテストを実行する
# 1. unittestのインポート
import unittest
# 2. クラスの作成
class TestXxx(unittest.TestCase):
# 3. テストケースを記述したメソッド
def test_xxx(self):
# 4. テストケースを記入
self.assertEqual(xxx(2),4)
if __name__ == '__main__':
# 5. 実行
unittest.main()
Let's Code
それでは、二つの数字を引数として受け取り、その足し算を返す関数を作り、ユニットテストを実装してみましょう。
足し算する関数を以下のようにしましょう。
def add(x, y):
'''
引数として受けた数字を足し算し、
その結果を返す
'''
return x + y
続いて、上で紹介した5つの順に沿ってテストケースを書きましょう。
「add」関数に引数として「2」と「3」を渡した時に「5」が返ってこなければならないの意味を持ったテストケースを書きます。
# ①unittestのインポート
import unittest
# ②unittest.TestCaseを継承したクラスの作成
class TestMyClass(unittest.TestCase):
# ③テストケースを記述したメソッド
def test_add(self):
# ④テストケースを記述
self.assertEqual(add(2,3),5)
# ⑤unittest.main()でテストを実行
if __name__ == '__main__':
unittest.main()
個人的にはクラスの名前はTestXxxそして、メソッドの名前はtest_xxxにするの好きです。
例えば、Calculatorというテスト対象のクラスがあった場合は以下の名称をつけます。
テストクラス名:TestCalculator
メソッド名:test_add, test_minus, test_product
補足:
上記のテストケースでは、assertEqualを使っていますが、assertNotEqual、assertTrueなど他にたくさんあるので、こちらを見てください。
実行
本来は、テスト対象の関数とテストケースを別々のファイルに書きますが、今回は、基礎を理解する目的ですので、全処理を一つのファイルに記述します。上で書いたコードをまとめますと以下のようになります。
# unittestのインポート
import unittest
def add(x, y):
'''
引数として受けた数字を足し算し、
その結果を返す
'''
return x + y
class TestMyClass(unittest.TestCase):
def test_add(self):
'''
上記の「add」関数に対してのテストケースを記述
'''
self.assertEqual(add(2,3),5)
if __name__ == '__main__':
unittest.main()
こちらの内容をtest_sample.pyとして適当な場所に保存してください。そして、タミナルからファイルを保存したフォルダーに移動し、python test_samply.pyを実行してください。
$ python test_sample.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
こちらの出力の意味は、一つのテストケースが成功したという事です。
最後に
テストケースを色々書いて、どのような結果が得られるか見てみて下さい。
また、こちらを参考にassertEqual以外のメソッドを使ってみてください。
続いてdoctestについても書いておりますので、違いを比較してみてください。