Python PR

【Python】unittestを使ってテストを実装する方法

記事内に商品プロモーションを含む場合があります

この記事では、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つの値が等しいかテストするアサートメソッドです。このようなアサートメソッドを使ってテストを実装していきます。

この例では、2module.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】

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ