Kuzunoha-NEのブログ

pythonの勉強中。

Python3でUnittestっていうのを触ってみたんだけど、誰かもっと教えてくれ

Python3でUnittestっていうのを触ってみたんだけど、誰かもっと教えてくれ

こんばんは、葛の葉です。

プログラミングにはユニットテストとか単体テストってのがあるんだそうですね。

www.techmatrix.co.jp

要するに、自分の作った関数がキチンと動いてるかを保証するためのものらしいんです。みんなは、自分の作ったプログラムを知らない他人に見せられる自信ありますか?私はちょっと自信ないです(^ω^;)

ただまぁ、自分が作ったプログラムは、いつかは知らん人が直したり機能を追加したりするわけですから、引継ぎ資料ってのは作っておくのがベターなのかなと思ってます。

引継ぎとはとても大事ですね。無いと夜中に電話かかってきてドス聞いた声で怒られますからね~。交代勤務してた前の職場ではそういう経験しました。あーあ。もっとも、引継ぎをちゃんとしなかった私が悪かったんですけどね。と、いうわけで、安眠を勝ち取るためにも引継ぎ資料はキチンとしたものを作らなきゃいけません。

importはこんな感じやけん

Python3だと内部Moduleにunittestというのが入っているので、pipとかでインストールする必要はありません。

最もnoseっていう外部Moduleでテスト用のものがあるらしいですけど、今回はunittestを使います。

import unittest

とりあえず関数を作る

引数に1を足した値を返す関数を作ります。ただし、整数以外の値が入るのは想定外です。そこで、引数の型がint以外はNoneを返すものにします。

kansu.py

def plus_one(alpha):
    if type(alpha) is int:
        alpha += 1
        return alpha
    else:
        return None

テストプログラムを作る

同じディレクトリ内test_kansu.pyを作りましょう。kansu.pyプログラムのテストなのでtest_kansu.pyがいいらしいです。 test_kansu.py

import unittest

import kansu


class TestMethods(unittest.TestCase):
    def test_plus_one(self):
        self.assertEqual(3, kansu.plus_one(2))
        self.assertNotEqual(3, kansu.plus_one(2.0))
        self.assertNotEqual(3, kansu.plus_one('1'))
        self.assertEqual(None, kansu.plus_one(1.0))
        self.assertEqual(None, kansu.plus_one('1'))


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

テストの実行

test_kansu.pyCLIから実行します。

python test_kansu.py

テストコードのファイル名がtest_*とか*_testとかだと、以下のようなものでも実行してくれるみたい。

python -m unittest

結果はこのような形になるかと思います。

.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

self.assertEqual(3, kansu.plus_one(2))assertの意味はよくわからないですけど(オイ)、Equalつまりイコールになります。第1引数と第2引数がイコールなら良いということみたいです。

kansu.plus_oneは先に作ったkansu.pyの関数です。2を入れたら3が返ってきます。assert.Equal(3,3)になるので、第1引数と第2引数はイコールになります。よってテストが成功となります。

一方で、kansu.plus_oneは整数じゃなければNoneを返すようにしています。ですので、kansu.plus_one(2.0)kansu.plus_one('1') はそれぞれNoneが返ります。

assert.NotEqual(3,None)になります。第1引数と第2引数は同じではありません。ただ、assert.NotEqualとあるようにノットイコールでテストしているので、これはテストが成功しています。

kansu.plus_one(2) は 3 である → ただしい!
kansu.plus_one(2.0) は 3 ではない → ただしい!
kansu.plus_one('2') は 3 ではない → ただしい!

ここまでの説明は以上のようにまとめることができます。複雑やな(^ω^;)。ちなみに、残りの部分はassert.Equalとして、第1引数がNoneで第2引数もNoneとなります。これもTrueです。

kansu.plus_one(2.0) は None である → ただしい!
kansu.plus_one('2') は None である → ただしい!

全部正しいので、この関数は問題がないってことみたいです。

.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

ちなみに、失敗していると、1行目.Eとなったり、Fとなったりします。 Eはプログラミングとして、エラー文の検出でFはFailedでテスト失敗のときに出ているようです。

下部のOKFailedになったりします。その時はどう失敗したかが、簡単にですが出力されるようです。

とまぁ、正直よくわかってねぇデス。

なんか、まぁ関数作ると、複雑になっちゃうんだけど、ユニットテストがあればこういう用途の関数なんですっていうのを説明できるんじゃあないかなって思います。あと、こういうエラー対応していますっていうの明示できる……かな……よくわかんないわ(^ω^;)