ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【python】単体テストの記述方法

rikoubou.hatenablog.com

 以前書いた記事でpythonのクラスとファイル分けをしました。

 今回はこの時作成したsumClass.pyを例として単体試験の書き方の備忘録という内容です。

 では始めます。


1:単体テスト用の書き方
 pythonにはデフォルトで単体試験用のクラスが用意されています。
 それを使用するには以下の一文で「unittest」をインポートします。

import unittest # 単体テストクラスインポート

 テスト内容の実装についてはunittest.TestCase のサブクラスとして作成し、その中に「test_」から始まるテスト関数を以下のように記述していきます。

import unittest # 単体テストクラスインポート

class TestSumClass(unittest.TestCase):
    def test_1(self):
        # テスト1の記述
    
    def test_2(self):
        # テスト2の記述
    
    # 以下略

 テストコードでの戻り値の確認などをする場合は以下のようなチェック関数があります。

# 第1引数と第2引数が同じ場合OK、違う場合NG
self.assertEqual('foo'.upper(), 'FOO')

# 引数の結果がTrueならOK、FalseならNG
self.assertTrue('FOO'.isupper())

# 引数の結果がFalseならOK、TrueならNG
self.assertFalse('Foo'.isupper())

 基本的には上記ぐらいが扱えれば特に問題はないかと思います。


2:単体テスト用のファイルの作成
 テスト用のファイルはどこでもいいのですが、前の記事で作成したmain.pyからsumClass.pyを呼び出しているので同じ階層に作るのが一番わかりやすくて良いかと思います。import文も呼び出しているところのコピペで済みます。
 今回は以下の場所に「test_sum.py」として単体テスト用ファイルを作成しました。
f:id:rikoubou:20190205172929p:plain


3:実際に単体テストを書いてみる
 単体テストの書き方がわかったので実際に「test_sum.py」を書いてみます。

 SumClassの中の「mySum」関数のテストコードを書いてみたのが以下になります。

#
# 単体テストコード
#
import unittest # 単体テストクラスインポート
from sum import sumClass as sc # SumClass読み込み

# テストのクラス
class TestSumClass(unittest.TestCase):
	"""
	test class of sumClass.py
	"""

	# テスト1
	def test_mySum1(self):
		sumInstance = sc.SumClass()
		result = sumInstance.mySum(10, 11)
		self.assertEqual(result, 21)

	# テスト2
	def test_mySum2(self):
		sumInstance = sc.SumClass()
		result = sumInstance.mySum(1, 11)
		self.assertEqual(result, 2)

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

 上記を実行すると「test_mySum1」についてはOKで「test_mySum2」についてはNGになります。
f:id:rikoubou:20190205174834p:plain

 一つでもNGとなった場合は、NGとなった関数名が出た後「FAILED(failures=[NG数])」としてNG数も表示されます。

 ちなみに全てOKだった場合は以下のように、OKとだけ表示されます。
f:id:rikoubou:20190205175114p:plain


 以上が簡単ですがpythonでの単体テストの記述方法です。

 複雑なものを作る場合には単体テストをやる必要が出てくるかと思うので、自分も記述するようにしていきたいです。


・参考資料