カテゴリー
アーカイブ

08.05
2024

Pythonでテストコードを書く

  • LINE

こんにちは!

今回はPythonでテストケースを作成する方法の基礎について色々まとめて行きたいと思います!

python にはunittestというライブラリが用意されており、こちらを使用すると簡単にテストケースを作成することができます。

テストをする関数の作成

まず、任意のディレクトリにcalc.pyというファイルを作成し、計算を行う関数をいくつか作成します。

今回はこの計算を行う関数が正常に動作をするかどうかをテストします。

def add(num1, num2):
    """足し算"""
    return num1 + num2


def sub(num1, num2):
    """引き算"""
    return num1 - num2


def mul(num1, num2):
    """掛け算"""
    return num1 * num2 

テストファイルを作成する

次にcalc.pyと同階層にtest_calc.pyというファイルを作成します。

unittestのTestCaseを継承したTestCalcというクラスを作成し、その中でテストケースを記載します。

assertEqualを利用し、期待値と実際の結果の一致・大小関係の比較を行います。

import calc  # 先程作成したcalc.pyをimportします
import unittest  # pythonに標準で用意されているライブラリです。

class TestCalc(unittest.TestCase):
    num1 = 10
    num2 = 2

    def test_add(self):
        expected = 12  # 期待値
        result = calc.add(self.num1, self.num2)  #実際の結果
        self.assertEqual(expected, result)

    def test_sub(self):
        expected = 8  # 期待値
        result = calc.sub(self.num1, self.num2)  #実際の結果
        self.assertEqual(expected, result)

    def test_mul(self):
        expected = 12  # 期待値
        result = calc.mul(self.num1, self.num2)  #実際の結果
        self.assertEqual(expected, result)


# テストを実行します
if __name__ = "__main__":
    unittest.main()    

今回作成したテストケースでは、num1 num2 を用意し、それぞれの関数で正常な結果が返ってくるかを確認しました。

こちらのtest_calc.pyを実行してみましょう。


test $ python test_calc.py
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s

OK
test $ 

以上のようにOKが返ってきているので、3つの関数全てで期待値と出力結果が一致しているということです。

では、テストケースの一部を書き換えてみましょう。test_mulの期待値を100に変更しました。

def test_mul(self):
    expected = 100
    result = calc.mul(self.num1, self.num2)
    self.assertEqual(expected, result)

もう一度テストを実行してみましょう。

test $ python test_calc.py
.F.
======================================================================
FAIL: test_mul(__main__.TestCalc)
----------------------------------------------------------------------
Traceback(most recent call last):
  File "test_calc.py", line 22, in test_mul
    self.assertEqual(expected, result)
AssertionError: 100 != 20

----------------------------------------------------------------------
Ran 3 tests in 0.001s

FAILE (failures=1)
test $ 

このように期待値と出力結果が異なる場合は、エラーが出力されます。

これで関数が期待の動作をするかどうかを確認することができます。

Assert

先ほどのテストでは、assertEqualを使って 期待値 == 出力結果 ということを確認しました。

もちろんa == b だけでなく、以下のように他にも比較するためのメソッドが用意されています。

メソッド 確認事項
assertEqual(a, b) a == b
assertNotEqual(a, b) a != b
assertTrue(x) x is True
assertFalse(x) x is False
assertIs(a, b) a is b
assertIsNot(a, b) a is not b
assertIsNone(x) x is None
assertIsNotNone(x) x is not None
assertIn(a, b) a in b
assertNotIn(a, b) a not in b

 

Python公式ドキュメント により詳細に書かれているので気になる方は見てみてください。

このように色々なパターンのテストができそうです。

まとめ

今回はpythonに標準で用意されているunittestを使い、テストを行いました。

テストコードを記載してテストを自動化するとだいぶテストが楽になると思うので、しっかりマスターしようと思います!

pythonには、doctest等他にもテストツールがあるそうなのでまたの機会にそれらのブログも書きたいと思います!