Python unittestを試してみる

Python学習【365日チャレンジ!】175日目のマスターU(@Udemy11)です。

今日は、屋外で少し作業をしました。

普通なら何箇所かは必ず蚊に刺されていたのですが、今日は全く刺されることもなく、耳もとであの嫌な羽音を効くこともありませんでした。

間違いなくあの虫よけが効いていることは間違いないようです。

今まで使っていた虫除けも、効果の持続時間が短いとはいえ、短時間であれば問題なく効くのですが、この強烈さを知ってしまうともうあとには戻れません。

そんな強力虫よけを、ぜひ体験してください。

それでは、今日もPythonを学習しましょう!

昨日の復習

昨日は、unittestで例外のテストを試してみました。

例外が発生するのにテストでは正常だというのに慣れるまで少し時間がかかりますが、テストは想定した状態になるかどうかが大切なので、頭がこんがらがらないように整理しておきましょう。

ということで、unittestにおける例外処理については、昨日の記事をごらんください。

今日は、unittestで使うsetupとteardownを学習します。

calculation.py

今回もテスト対象のモジュールはcalculation.pyで、中身のコードも昨日までと同じものです。

class Cal(object):
    def add_and_double(self, x, y):
        if type(x) is not int or type(y) is not int:
            raise ValueError
        result = x + y
        result *= 2
        return result

テスト対象ファイルの次は、テストを実行するファイルを見てみてましょう。

test_calculation.py

unittestを実行するファイルもこれまた前回同様test_calculation.pyですが、昨日、一昨日に書いたコードを合わせたものに新しいコードを付け加えます。

import unittest

import calculation

class CalTest(unittest.TestCase):
    def setUp(self):
        print('setup')
        self.cal = calculation.Cal()

    def tearDown(self):
        print('clean up')
        del self.cal
        
    def test_add_add_double(self):
        self.assertEqual(self.cal.add_and_double(1, 1), 4)

    def test_add_and_double_raise(self):
        with self.assertRaises(ValueError):
            self.cal.add_and_double('1', '1')

if __name__ == '__main__':
    unittest.main()

追加したのはハイライトしている行ですが、8行目でself.calオブジェクトを生成することで、テストする関数で個別にcalオブジェクトを生成することなく、15行目と19行目のようにself.calとして利用することができるようになり、コードが少しスッキリします。

setUptearDownは、テストの関数を実行する前と後になにかの処理をさせることができるメソッドです。

関数の実行前と実行後でなにかの処理をさせるときくと、デコレーターを思い浮かべる人もいるかと思います。

処理的には、デコレーターと同じで、setUpが、テストの関数を実行する直前になにかの処理をさせて、tearDownは、テストの関数を実行し終えてから何らかの処理をさせることができます。

今回は、テスト実行前にsetupを出力し、実行後にclean upを出力するコードを書いてみました。

テスト結果

test_calculation.pyを実行すると、次のような結果がコンソールに表示されます。

setup
clean up
setup
clean up


Ran 2 tests in 0.004s

OK

setupclean upが2回表示されて、2つのテストが問題なく処理されたということが表示されます。

テストは、変数xyにそれぞれ1を入れたときの計算結果が4になるテストと、関数に文字列の1を代入したときにValueErrorが返されるテストなので、2回setupclean upが繰り返されています。

このcleanUptearDownを使用することで、テストする関数が多い場合は、どこの関数がテストをパスするのか、きちんと処理ができていないのかがわかりやすくなります。

問題を見つけやすく

今日学習したことは、デバックでコードをチェックしていけばわからなくなくもないわけですが、いちいちデバックをチェックするより、テストファイルを実行するだけで問題がわかるので、最もよく使われる関数になるので、しっかりと憶えておきましょう。

また、これまでは、1つ1つのテスト関数でオブジェクトを生成していましたが、最初にオブジェクト(self.cal)を作ることで、テストの関数内でオブジェクトを生成する必要がなくなりました。

ちょびっとづつですが、過去の便利な関数などについて、再利用されていることが多いので、忘れてしまっているときは、一度過去の内容に戻ってチェックしてみるといいかもしれませんね。

それでは、明日もGoodPython!