[Python]unittestを使ってみる

python

Pythonの標準モジュールであるunittestを使ってみます。

備忘録を兼ねてメモ。

unittestを使うための下準備

まず下準備を。テストされる側のファイルとテストファイルを作成します。

今回、簡単な例として2つの数値を掛けるコードを書きます。(cal.py)

そして、それをテストするファイルとしてtest_cal.pyを用意します。

前回、doctestも紹介しましたが同じコードを使ってみます。

doctestの記事はこちら。

[Python]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個スキップしたよと記載されていますね。



カテゴリー