Python3でUnittestっていうのを触ってみたんだけど、誰かもっと教えてくれ
Python3でUnittestっていうのを触ってみたんだけど、誰かもっと教えてくれ
こんばんは、葛の葉です。
プログラミングにはユニットテストとか単体テストってのがあるんだそうですね。
要するに、自分の作った関数がキチンと動いてるかを保証するためのものらしいんです。みんなは、自分の作ったプログラムを知らない他人に見せられる自信ありますか?私はちょっと自信ないです(^ω^;)
ただまぁ、自分が作ったプログラムは、いつかは知らん人が直し
たり機能を追加し
たりするわけですから、引継ぎ資料
ってのは作っておくのがベターなのかなと思ってます。
引継ぎ
とはとても大事ですね。無いと夜中に電話かかってきてドス聞いた声で怒られますからね~。交代勤務してた前の職場ではそういう経験しました。あーあ。もっとも、引継ぎ
をちゃんとしなかった私が悪かったんですけどね。と、いうわけで、安眠を勝ち取るためにも引継ぎ資料
はキチンとしたものを作らなきゃいけません。
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.py
をCLI
から実行します。
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でテスト失敗のときに出ているようです。
下部のOK
もFailed
になったりします。その時はどう失敗したかが、簡単にですが出力されるようです。
とまぁ、正直よくわかってねぇデス。
なんか、まぁ関数作ると、複雑になっちゃうんだけど、ユニットテストがあればこういう用途の関数なんです
っていうのを説明できるんじゃあないかなって思います。あと、こういうエラー対応しています
っていうの明示できる……かな……よくわかんないわ(^ω^;)