PythonでUnitTest

2021年05月17日

PythonでUnitTestする方法を紹介します。

この記事では副作用のない簡単な関数に対するテストを書いてみます。

コード

add関数を定義します。 引数で受けたものを足し算するだけの簡単な内容です。

mytest.py
def add(x, y):
    return x + y

定義した関数の振る舞いをテストします。
今回は、

  • 正常系 - パラメータにint値を受けた場合足し算した結果が保証される
  • 異常系 - パラメータにint値と文字列が渡された場合例外処理にたおれる

という振る舞いをテストします。

mytest.py
from unittest import TestCase


class AddTest(TestCase):
    def test_normal(self):
        '''正常系'''
        self.assertEqual(
            add(1, 1),
            2
        )

    def test_error(self):
        '''異常系 - 型不一致'''
        with self.assertRaises(TypeError):
            add(1, '文字')


def add(x, y):
    return x + y

テストコードは一般的なテストフレームワークと同じ考え方で構成します。

  • unittest.TestCase を継承したクラスを宣言し、テストケースを定義
  • テストケースクラス配下に test_ をprefixにテストメソッドを宣言
  • テストメソッド毎にテストコードを記述

簡単ですね!

Assertionチェック

テストのアサーションチェック用のメソッドはTestCaseクラスに定義されているものを利用します。 代表的なものは以下となります。その中でもよく使う assertEqual, assertGreater, assertNone 辺りは覚えておくと良いでしょう。

メソッド検査ロジックよく使う
assertEqualx == y
assertTruex is True
assertIsNonex is None
assertInx in y
assertIsInstanceisinstance(x)
assertRaisesraise x
assertGreaterx > y
assertGreaterEqualx >= y
assertLessx < y
assertLessEqualx <= y

今回組んだテストコードでは、add(1, 1) == 2 を保証するために等価チェックを入れています。

self.assertEqual(
    add(1, 1),
    2
)

テスト実行

テストケースを mytest.py というモジュール名で保存し、同ディレクトリで以下コマンドを実行すると実行されます。

$ python -m unittest mytest
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK

-m unittest をコマンドラインオプションで指定するとunittestモジュールのテストランナーを起動することができます。

$ python mytest.py だとテストが実行されないので注意してください。


Web系エンジニアでPython好き。バックエンド/フロントエンド問わずマルチな方面でエンジニアリングしています。