つかぱい.com

どうせなら好きなことを書いていたい

【Python】UnitTestをするためにやったこと

目次

  • 前提条件
  • そもそもUnitTestって何?
  • テストするためにやることどんなことが必要?
  • メソッド呼び出せない?
  • 入力する情報って何?
  • テストで正しいって証明するためにはどんなことが必要?

前提条件

黒い画面で操作がちょっとだけできる人 スペックはPythonが動けば何でも良い

そもそもUnitTestって何?

単体テスト(ユニットテスト)とは | ソフトウェアの検証の種類 | テクマトリックス株式会社

プログラムのメソッドなど、プログラムを構成する一番小さい粒度できちんとプログラムが機能しているかをテストすることを指します。 IT業界では単体テストなんて言われ方もする。

それぞれの言語で単体テストを行ってくれるライブラリが存在しています。 以下は例

余談ですがRubyなどではMinitestやRspecなどが単体テストの機構としてがあります。

テストするためにやることどんなことが必要?

PythonでUnitTestを実施するためには、テストコードを書いておくためのPyファイルを記述します。

詳しいテストを記述については日本語の公式ドキュメントがあるので参照してください。

unittest — ユニットテストフレームワーク — Python 3.8.6 ドキュメント

VSCodeなどを利用して次のようなファイルを作成していきます。

このケースでは意図的に失敗するテストケースを記載しています。

sample.py

import unittest

class TestStringMethods(unittest.TestCase):

    def test_false(self): 
        self.assertFalse("hoge", "hoge")

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

次にコンソール上でプログラムを実行してみます。

CLI上で実行する場合は、以下のようなコマンドでUnitTestを実行することができます。

python3 -m unittest sample.py

======================================================================
FAIL: test_false (test.sample.TestStringMethods)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/pcuser/Documents/GitHub/pysecret/test/sample.py", line 6, in test_false
    self.assertFalse("hoge", "hoge")
AssertionError: 'hoge' is not false : hoge

----------------------------------------------------------------------
Ran 1 test in 0.001s

FAILED (failures=1)

こんな感じに、FAILDが表示されて失敗していればOK もしERRORの表示が出ている場合はPythonの文法上の問題だったりするので、ググって見てください。

Pythonでよくあるエラーはこんなものがあったりします。 【参考のエラメッセージを入れる】

メソッド呼び出せない?

この後は実際にテストケースを記載していきます。

なるべく実践的なテストにするため、テスト対象となるプログラムを作成しておきます。

hello.py

def helloMethod(str):
    msg = str
    return msg

if __name__ == '__main__':
    main()

その後、test.pyにinport helloを追加し、helloMethodが呼び出せるようにしましょう。

入力する情報出力する情報って何?

今回は単純なオウム返しをするメソッドを作成しました。 入力として渡すものはメソッドの引数で渡す文字列のstr変数になります。 そして期待値としてはメソッドを実行したらstrが出力として返却されるという想定です。

import unittest
import hello

class TestStringMethods(unittest.TestCase):

    # def test_false(self):
    #     self.assertFalse("hoge", "hoge")
    
    def test_hello(self):
        input_str =  "Hello"
        msg = psmg.helloMethod(input_str)
        self.assertEqual(msg, input_str)

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

テストをクリアするにはどんなことが必要?

結果が正しいかの検証にはAssertメソッドを使ってmsg変数に格納された値とinput_strの値が同一であるということを確認します。

書き方としてはUnitTestクラスが持つAssertメソッドを使うのでself.assertEqualを使います。

ソース上ではすでに先程書いてあるのでUnitTest自体の起動を確認したコマンドと同じものを再度実行します。

python3 -m unittest sample.py

.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

コンソール上でOKの文字が表示されていればテストが成功しています。

development/Python