[Python]unittestを使ってみる
Pythonの標準モジュールであるunittestを使ってみます。
備忘録を兼ねてメモ。
unittestを使うための下準備
まず下準備を。テストされる側のファイルとテストファイルを作成します。
今回、簡単な例として2つの数値を掛けるコードを書きます。(cal.py)
そして、それをテストするファイルとしてtest_cal.pyを用意します。
前回、doctestも紹介しましたが同じコードを使ってみます。
doctestの記事はこちら。
# cal.py class Cal(object): def double(self, x, y): result = x * y return result
もう1つ、unittestを記述するファイルを作成します。
# test_cal.py import unittest import cal class CalTest(unittest.TestCase): def test_double(self): c = cal.Cal() self.assertEqual(c.double(2, 1), 4) if __name__ == '__main__': unittest.main()
unittestを作成する時のお約束事をまとめると、
- unittestとテストをしたいモジュールをimportする
- クラス名Test(unittest.TesCase)の形で
- 関数名の前にはtest_を付ける(その後の関数名は何でもいいですが、分かりやすくモジュールの関数と統一します)
- if __name__ 〜略〜を記述する
self.assertEqual(c.double(2, 1), 4)
この部分がテスト実行部分です。assertEqual(関数実行, 予想される返り値)というように記載します。
今回、2と1を入れて(つまり2*1の計算を行う)返り値に4を期待しています。まあ、2*1の答えは2なのでエラーが返ってくるはず。
実行してみましょう。
python test_cal.py Traceback (most recent call last): File "test.py", line 8, in test_double self.assertEqual(c.double(2, 1), 4) AssertionError: 2 != 4 ---------------------------------------------------------------------- Ran 1 test in 0.001s FAILED (failures=1)
はい。テストに失敗しました。それでは返り値に2を入れてもう一度実行します。
python cal_test.py Ran 1 test in 0.000s OK
無事に成功しました。
assertEqual以外にも
今回は実行結果と予想結果が同一であるかどうかをテストしましたが、TestCaseクラスにはたくさんのメソッドが用意されています。
- assertTrue
- assertFalse
- assertIsNone
名前で大体分かりますね。他にもたくさんあるので公式リファレンスを確認してみてください。
unittestフレームワーク | Pythonリファレンス
ちなみにassertという英単語は「断言する」などの意味合いがあるようです。
あえてユニットテストをスキップする
複数のテストを実行する内に「このAテストは今回、スキップしていいな」となった時に、わざわざ該当箇所を削除しなくても簡単にスキップできます。
# test_cal.py import unittest import cal class CalTest(unittest.TestCase): @unittest.skip('スキップします') def test_double(self): c = cal.Cal() self.assertEqual(c.double(2, 1), 2) if __name__ == '__main__': unittest.main()
@unittest.skip()という記述を関数の前に書くだけで、その部分をスキップすることができます。
実行結果は以下の通り。
python test_cal.py Ran 1 test in 0.000s OK (skipped=1)
今回は1つのテストしか書いていませんが、テストパスしたよ、でも1個スキップしたよと記載されていますね。