この記事では、Pythonのunittestモジュールを用いてテストを実装する方法を解説します。
何かしらのプログラムを実装した際に正常に動作するか実行してみると思いますが、毎回手動で色々なパターンを試行するのは時間がかかるしめんどくさいです。
なので、ユニットテストフレームワークを用いてテストを自動化してしまいましょう!
関数やクラスのテストを実装することで将来コードが複雑になっても、その関数やクラスが期待通りに動作することを保証することができます。
また、コードを見直す際にテストを見ることで動作や使用例をまとめて見ることができ、さらにコメントを書いておくことでコードを理解するのにも役立ちます。
それでは、テストの実装方法を見ていきましょう!
Linkunittest --- ユニットテストフレームワーク — Python 3.10.4 ドキュメント
テストの実装
単純なテストを作成するには、unittest
モジュールのTestCase
を継承させたクラスを定義してメソッドとしてテストを実装します。
実際に簡単なモジュールのテストを実装しながら使い方を見ていきましょう!
モジュールの作成
以下のようなmodule.py
を作成します。モジュール内には引数を2つ取り、商を返すだけの関数を定義しました。
module.py
def div(x, y):
return x / y
テストの実装
テストを実装するためのtest.py
を作成してテストを書いていきます。
モジュールのインポート
必要なモジュールをインポートします。
import unittest
import module
クラスの定義
TestCase
を継承したクラスを定義します。クラス名はTest + モジュール名
などにして何をテストしているかわかりやすく命名します。
class Testmodule(unittest.TestCase):
・
・
・
メソッドの定義
メソッドを定義してテストを実装します。テストを実装するメソッド名はtest
から始まる必要があります。よくtest_関数名
という名前が用いられます。
class Testmodule(unittest.TestCase):
def test_div(self):
self.assertEqual(2, module.div(4, 2))
メソッドの中を見てみます。
self.assertEqual(2, module.div(4, 2))
self.assertEqual()
は渡された2つの値が等しいかテストするアサートメソッドです。このようなアサートメソッドを使ってテストを実装していきます。
この例では、2
とmodule.div(4, 2)
の結果が等しくなるかテストしています。
アサートメソッドはいくつも定義できるので想定できるパターンをそれぞれ実装することでテストがより強固となります。
最後に
最後にtest.py
がエントリーポイントとして実行された際にテストが実行されるためのコードを書いておきます。
if __name__ == '__main__':
unittest.main()
unittset.main()
は、modlue
引数(デフォルト='__main__')に指定されているモジュールからテストを読み込んで実行するためのコマンドラインプログラムです。
test.py
は最終的に以下のようなコードになりました。
import unittest
import module
class Testmodule(unittest.TestCase):
def test_div(self):
self.assertEqual(2, module.div(4, 2))
if __name__ == '__main__':
unittest.main()
テストの実行
先ほど作成したtest.py
を実行してみると以下のような結果が表示されます。
python test.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
OK
と表示されたので今回のテストは成功です。では、失敗するパターンも見てみましょう!
あえてテストが失敗するようにアサートメソッドを書き換えてみます。
self.assertEqual(1, module.div(4, 2))
そして、実行すると以下のような結果が表示されます。
python test.py
F
======================================================================
FAIL: test_div (__main__.Testmodule)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/user/Desktop/Python/test.py", line 7, in test_div
self.assertEqual(1, module.div(4, 2))
AssertionError: 1 != 2.0
----------------------------------------------------------------------
Ran 1 test in 0.000s
FAILED (failures=1)
FAILED
と表示され、テストが失敗しました。
今回はわざと失敗させたので問題ありませんが、テストが失敗したら実装を確認し、成功するように書き直しましょう!
まとめ
この記事では、unittest
モジュールを用いたテストの書き方と実行を解説しました。
テストが書かれていないソースコードはクソコードだと言われるくらいテストは重要なものです。めんどくさいですが書くように心がけましょう!
また、テストはドキュメンテーション文字列で行うこともできます。気になる方は以下の記事を参照してください。
docstringを使って関数をテストする方法を解説【doctest】
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ