初心者こそ、すぐにテストを実行せよ!Python + Unittestの第3回を書いていきたいと思います。
もくじ
目標
この記事では、コード量が増加することを考慮して、ファイル分離する方法やテストコード用の関数を紹介します。
- メインコードとテストコードを分けてみよう
- テストコードで使える評価関数の一覧をみてみよう
対象者
- Pythonのプログラミングをはじめた方
- hello worldをプログラムで表示できる方
- 勉強するなら、ほんの少しレベルの高いことを学びたい
- 少しでもはやく、中級者の道へ進みたい方
おさらい
第2回目では、関数や変数を使ったテストコードの書き方と実行例を解説しました。
想定するテストケースごとに関数を作れば、それらがテストコードになるため、あなたは常に新しいコードを書くことに集中力できます。
まだ、2回目を読んでない方は、
テストコードは、Unittestにお任せあれ!!
それでは、テストコードの書き方を見ていきましょう。
テストコードは、第1回目及び第2回目でも使ったUnittestを使います。
今回から、テンプレートのファイル名を変更します。
“sample_test.py“と定義ください。
#サンプルプログラム : Sample.py # Unit testを使うことを宣言しまーす! # スポーツマンシップに則り、正々堂々戦う事を誓います! 高校野球じゃないよ ( ^∀^) # 宣言するには、キーワードのimportを使います。 import unittest class MyTest(unittest.TestCase): def test_XXX(self): if __name__ == "__main__": unittest.main()
メインコードとテストコードを分けてみよう
前回までは、”sample.py“というファイルの中に、メインコードとテストコードを一緒に書きました。
しかし、コードが長くなると、二つのコードを区別するのが難しくなりますし、テストコードをメインコードから独立させれば、テストケースごともしくは、あるまとまった処理ごとにファイルを分けることができます。
イメージで言うと、膨大の量の書類をカラフルな色のファイルケースに分別して入れる感じです。
また、ファイル名ですが、少し工夫することで見やすくなります。
コードから何のテストをしているかを理解することは必要ですが、ファイルを開く前に、ファイル名からある程度テスト内容を予測できた方がいいかと思いませんか?
例えば、”polygon.py“と言うメインコードがあった場合、(Polygon:多角形)
三角形に関わるテストケースを定義したファイル名を下記のようにする。
- polygon_test_triangle.py
四角形に関わるテストケースを定義したファイル名をを下記のようにする。
- polygon_test_rectangle.py
ファイル名を工夫しただけで見やすくなってませんでしょうか。
また、フォルダでファイル一覧を見た時にも、Polygon.pyのメインコードの近くにまとまって表示されるため視認性は高くなります。
それでは、サンプルコードを見てみましょう。
まずは、メインコードとしてpolygon.pyを下記のように作成。
def area_of_triangle(base, height): return base * height / 2
そして、テストコードとしてpolygon_test_triangle.pyを下記のように作成。
import unittest import polygon class MyTest(unittest.TestCase): def test_三角形の面積_底辺Xと高さY(self): x = 2 y = 5 期待値は = 10 self.assertEqual(期待値は, polygon.area_of_triangle(x, y)) if __name__ == "__main__": unittest.main()
それでは、少し解説したいと思います。
ファイルを別にため、下記2点の変更が必要です。
①import構文を使って、polyponを読み込む
import polygon
②関数の呼び出しをファイル名を追加した形に変更する
polygon.area_of_triangle(x, y)
この変更を加えただけで、テストコードが実行できます。
まずは、テストを失敗させましょう。 X=2, Y=5 , 期待値は10
(base) Tommy$ python polygon_test_triangle.py -v test_三角形の面積_底辺Xと高さY (__main__.MyTest) ... FAIL ====================================================================== FAIL: test_三角形の面積_底辺Xと高さY (__main__.MyTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "polygon_test_triangle.py", line 11, in test_三角形の面積_底辺Xと高さY self.assertEqual(期待値は, polygon.area_of_triangle(x, y)) AssertionError: 10 != 5.0 ---------------------------------------------------------------------- Ran 1 test in 0.001s FAILED (failures=1)
テストコードを変えてテストを成功させます。
(base) Tommy$ python polygon_test_triangle.py -v test_三角形の面積_底辺Xと高さY (__main__.MyTest) ... ok ---------------------------------------------------------------------- Ran 1 test in 0.000s OK
上記のように、メインコードとテストコードを分けて開発できるようになりました。
テストコードで使える評価関数の一覧をみてみよう
テストコード内で検証内容と期待値を比較する関数は、ライブラリー関数としてたくさん定義されています。
関数名 | 評価 |
assertEqual(a, b) | a == b |
assertNotEqual(a, b) | a != b |
assertTrue(a) | a == True |
assertFalse(a) | a == False |
assertGreater(a, b) | a > b |
assertGreaterEqual(a, b) | a >= b |
assertLess(a, b) | a < b |
assertLessEqual(a, b) | a <= b |
比較演算子を主に取り上げましたが、他にもたくさんの関数が用意されています。
まずは、上記に挙げた関数をたくさん使って、使い方をマスターしてください。
まとめ
この記事では、メインコードとテストコードを別ファイルに分ける方法を説明しました。また、テストコード内の評価で使える関数一覧もご紹介しました。
あとは、実践あるのみ!是非いろいろなテストケースを書いてみてください。