Python unittestを試してみる

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

アベノマスクの8000万枚再配布計画といい、GOTOコロナ拡大キャンペーン?!といい日本政府の劣化が止まりませんね。

東日本大震災の時のように、もともと危機管理能力0に近くて、劣化しているわけではないのかもしれませんが、日本のことをきちんと考えてリーダーシップをとれる政治家はいないのでしょうか?

このまま自民党が次の選挙で勝つようなら、ほんと日本国民はなにを考えているんでしょうね。

ま~代わりに政権を任せられるような人材もいないわけですから、もしかしたら、自民党が圧勝したりして。。。

政治の話はこれくらいにして、今日もPython学習を始めましょう。

昨日の復習

昨日は、簡易なテストができるdoctestを学習しました。

関数の前にドキュメントのように"""で囲んで対話型シェルのように、実行コマンドと期待する返り値を記述しましたね。

doctestを書くのは面倒ですが、きちんと書いておけば、その関数が何をしたいのか、何を期待しているのかがわかりやすくなるので、doctestは、きちんと書いておいたほうがいいでしょう。

doctestの詳細は、昨日の記事をごらんください。

unittestとは

Unittestは、doctestと同じように、プログラム全体をテストするわけではなく切り分けたモジュールやメソッドといった小さな単位の機能をテストするためのものです。

テストする単位が小さいので、バグの原因を特定しやすく、修正も容易にできるのが特徴です。

大きな企業は別として、ユニットテストに割く時間を他のコードを書く時間にあてる方が時間を無駄にしないと考える人が多いようで、実際には、Unittestを書いていないプログラムも多く存在するようです。

といっても、doctestの時と同じように、どのような処理が行われて、どのような例外を想定内にしているのかなどが一目でわかるため、書いた方がいいという意見もあるようです。

また、unittestは、テストの自動化やセットアップ、シャットダウンコードの共有、コレクション化などをサポートしていて、4つの概念をオブジェクト指向でサポートしています。

この説明は、公式ドキュメントから拝借してきましたが、詳しく理解するためには公式ドキュメントを読み込んでみて下さい。

それでは、実際にunittestを使ってコードを書いていきましょう。

テストのための準備

今回使用するPythonファイルはcalculation.pytest_calculation.pyの2つです。

最初にこの2つのファイルを作成し、インタープリターをtest_culculation.pyにしますので、Edit Configrationから変更します。

unittest Python

次に表示される画面で、名前を【Unittests】にして、スクリプトをtest_calculation.pyを指定して【OK】をクリックします。

unittest Python

次に、ファイル名のタブを右クリックして【Split Horizontally】を選んで画面を上下に分けておきます。

Python unittestを試してみる

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

変数x,yを足して2乗するコードを入れて、文字列を入れた場合はValueErrorが起こるコードになっています。

続いて、このコードをテストするファイルを作成します。

test_calculation.py

このファイルに記述するコードは次のとおり

import unittest

import calculation

class CalTest(unittest.TestCase):
    def test_add_and_double(self):
        cal = calculation.Cal()
        self.assertEqual(cal.add_and_double(1, 1), 4)

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

unittestをインポートしたあと、先程作成したcalculation.pyをインポートしています。

5行目でunittest.TestCaseの要素を引き継いだCalTestクラスを作成し、テストする関数を引き継ぎ、Calオブジェクトを生成した後、指定した条件cal.add_and_double(1, 1)と答え4が同じかどうかのテストを行っています。

テストの結果

非常に簡単なテストなので、非常に簡単な内容になっていますが、このコードではエラーが起こらず、次のように表示されます。

Python unittestを試してみる

あと、試してもらえればわかりますがcalculation.pyの8行目の予測値を4から5に変更して、test_calculation.pyを実行すると、コンソールに次のように表示されます。

Ran 1 test in 0.005s

FAILED (failures=1)


5 != 4

Expected :4
Actual   :5

「あんたは5だって言うけど、結果は4で、同じじゃないよ」

という回答がかえってきます。

きちんと間違いをひらうことができていますね。

いろいろなテストができる

今日はself.assertEqual()で、計算結果が正しいかの検証を行いましたが、他にもassartを使ったテストを行うことができます。

Pycharmの場合は、先程のtest_calculation.pyの8行目同様に、self.と入力すれば、たくさんのassartが出てきます。

Python assetがたくさん用意されている

これらはすべてテストにつながっているので、公式ドキュメントを見ながら、いろいろと試してみてください。

復習は重要

一度やったくらいでは、間違いなく次の日に忘れてしまいます。

エビングハウスの忘却曲線

以前紹介したこのエビングハウスの忘却曲線によると、学習から24時間以内に10分の学習、そこから1週間以内に5分の学習で記憶をキープすることが可能となるので、復習は非常に重要です。

Python学習を始めてからすでに半年近く経過しているので、最初の頃に学習した内容はかなり記憶が薄れてきていることは間違いありません。

少しずつ、復習も兼ねながら、Python学習を進めていこうと思います。

それでは、明日もGood Python!