unittestとは
一言でいえばpythonプログラムのテスト用ツールです。
このunittestをimportしたpythonファイルにどんなテストを行うかを書き、そのファイルを実行することテストすることができます。
メリット
- テスト用のファイルを実行することで、複数のテストを一括で行える。
- プログラムの修正が入っても、テスト用ファイルを作っておけば、再度実行するだけですぐにバグがないか確認できる。
- coverageモジュールを併用することで、テストして実行した行、実行していない行を確認でき、テストの網羅率がわかる
- Mock関数を使って、テスト対象のクラスやメソッドの戻り値をダミーデータに変更してテストできる。
unittest 使い方
unittestの使い方について記載していきます。
まずはテストのテスト対象とするpythonプログラムを用意します。
class Calc: """ テスト対象用クラス 計算クラス """ def tasu(self, a, b): """ 足し算メソッド """ return a + b def hiku(self, a, b): """ 引き算メソッド """ return a - b
Calcクラスのテストを行うTestCalcクラスを作ります。
import unittest from calc import Calc class TestCalc(unittest.TestCase): def test_tas(self): c = Calc() ans = c.tasu(1, 2) self.assertEqual(ans, 3) def test_hiku(self): c = Calc() ans = c.hiku(3, 2) self.assertEqual(ans, 1) if __name__ == "__main__": unittest.main()
解説
基本事項
- unittestを行う側のクラスには、unittest.TestCaseを継承する必要がある。
- テストする内容を、unittest.TestCaseを継承したクラスのメソッド(先頭がtest)に書く。
- テストをするには、main文にunittest.main()を書いてファイルを実行することでテストできる。
- assert系のメソッドの結果で、テストで問題があるか無いかを判断する。
self.assertEqual(ans, 3)の部分は,ans==3の関係であれば、正しく処理が行われていると判断してバグがないという結果をだします。
実行結果
.. ---------------------------------------------------------------------- Ran 2 tests in 0.000s OK
TestCalcを実行すると上記のように実行した結果が出ます。
test_hiku()のself.assertEqual(ans, 1)を、(ans, 2)に変更すると、値が一致していないという想定した結果がかえって来ないので、下記のような結果になる。
テスト失敗時の実行結果
F. ====================================================================== FAIL: test_hiku (__main__.TestCalc) ---------------------------------------------------------------------- Traceback (most recent call last): File "d:/study/Python/workspace/unittest/test_calc.py", line 14, in test_hiku self.assertEqual(ans, 2) AssertionError: 1 != 2 ---------------------------------------------------------------------- Ran 2 tests in 0.001s FAILED (failures=1)
解説
- ..は1つのtestメソッドを実行して、正しい処理が行われた場合に.が1つ出力される。(失敗した場合はF)
- Ran 2 tests in 0.000sは、実行した数と実行にかかった時間。
- FAILED (failures=1)はテスト時に問題があった処理の数。
テスト結果の詳細を見る
テストを実行するときに-vオプションをつけて実行することで、テスト結果が詳しくなります。
下記のテストを-vオプションをつけて実行します。
import unittest from calc import Calc class TestCalc(unittest.TestCase): def test_tas(self): """足し算 """ c = Calc() ans = c.tasu(1, 2) self.assertEqual(ans, 3) def test_hiku(self): """引き算 """ c = Calc() ans = c.hiku(3, 2) self.assertEqual(ans, 2) if __name__ == "__main__": unittest.main()
実行結果 -vオプション付き
PS D:\study\Python\workspace> & python d:/study/Python/workspace/unittest/test_calc.py -v test_hiku (__main__.TestCalc) 引き算 ... FAIL test_tas (__main__.TestCalc) 足し算 ... ok ====================================================================== FAIL: test_hiku (__main__.TestCalc) 引き算 ---------------------------------------------------------------------- Traceback (most recent call last): File "d:/study/Python/workspace/unittest/test_calc.py", line 18, in test_hiku self.assertEqual(ans, 2) AssertionError: 1 != 2 ---------------------------------------------------------------------- Ran 2 tests in 0.001s FAILED (failures=1)
解説
-Vオプションをつけて実行することのメリットは下記の2点です。
- メソッドの1行目に書いたコメントがテスト結果に出力されるところです。メソッド名だけでは、どのような処理をしているかがわからないときに見やすくなります。
- どの処理が成功、失敗したのかが最初に表示されます。