ITエンジニアのコツコツ日記

ITエンジニアの雑記です

Pythonのユニットテスト(UT)について

ユニットテストとは

f:id:itkotsukotsu:20210317235712p:plain

ユニットテストは単体テストと呼ばれるもので、プログラムを構成する小さな部品が動作しているかを確認するテストだ。

プログラムにおいては普通は関数/メソッド単位でテストを行う。

ユニットテストを行うことで、この関数が担う処理のテストが可能である。

テストしたい関数内で呼び出されるほかの関数の入出力はモック化され、テストにおいては固定値として実行することが多い。

これにより、テストしたい関数の実装の検証に焦点を当てることができる。

Pythonにおけるユニットテスト

pythonにおけるユニットテストは公式ライブラリであるユニットテストフレームワークを利用する。

以下は簡単なテストの例だ。

import unittest

class TestMethods(unittest.TestCase):

    def test_upper(self):
        self.assertEqual('hogee'.upper(), 'HOGEE')

if __name__ == '__main__':
    unittest.main()

ユニットテストの書き方

ユニットテストを書くためには以下が必要だ。

  • カバレッジ網羅
  • 関数のモック化
  • 変数のモック化
  • クラスインスタンスのモック化

カバレッジ

カバレッジはテストしたい関数内におけるコードがどれくらい実行できるかの割合で表したものだ。 詳しくはここで解説しないが、実施したいレベルに合わせる。

例えば、c0においては分岐が複数あるのであればそれぞれの分岐を実行するようなテストケースを実行しないといけない。

c1であれば、分岐条件の網羅が必要になるので、それぞれの条件式の判定条件の真偽は一回実行されるようにする必要がある。

関数のモック化

ユニットテストする関数で外部関数を呼び出す場合はモック化する必要がある。 モックとは入出力を行う呼び出しをダミー化することで、呼び出したい関数の返却値を期待する固定値で返却する。

# 関数モック化のテスト
class TestMethodMock(unittest.TestCase):
    def test_method_mock(self):
        with mock.patch('') as mock_lock
            test_upper()