tachitomonn’s blog

IT技術関連の学習メモがメインでたまに趣味のこととか

Python でテスト unittest

Python の標準ライブラリに含まれるユニットテストフレームワーク unittest の基本を押さえます。
公式ドキュメント
unittest --- ユニットテストフレームワーク — Python 3.8.1 ドキュメント
によれば、

unittest ユニットテストフレームワークは元々 JUnit に触発されたもので、 他の言語の主要なユニットテストフレームワークと同じような感じです。 テストの自動化、テスト用のセットアップやシャットダウンのコードの共有、テストのコレクション化、そして報告フレームワークからのテストの独立性をサポートしています。


公式ドキュメントの基本的な例を参考に前回の記事の平成暦を西暦に変換する関数を unittest でテストするスクリプトを書くとこんな感じ。

study_unittest.py

#! /usr/bin/env python

u"""unitest の勉強用サンプル
"""

import unittest
from study_doctest import heisei2seireki

class TestSample(unittest.TestCase):

    def test_heisei2seireki(self):
        self.assertEqual([heisei2seireki(n) for n in range(1, 32)],
                [1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019])
        with self.assertRaises(ValueError):
            heisei2seireki(-1)
        with self.assertRaises(ValueError):
            heisei2seireki(0)
        with self.assertRaises(ValueError):
            heisei2seireki(1.5)
        with self.assertRaises(ValueError):
            heisei2seireki(32)

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

ポイントとしては、

  • テストケースは、 unittest.TestCase のサブクラスとして作成する
  • テスト対象のメソッド名は test で始めることにより、テストランナーがこの命名規約によってテストを行うメソッドを検索してくれる
  • assert 文の代わりに assert~ メソッドを使用すると、テストランナーでテスト結果を集計してレポートを作成する事ができるらしい

最後の unittest.main() は、テストスクリプトコマンドライン用インターフェースを提供していてコマンドラインからこのスクリプトを実行すると、以下のように出力される。

>python study_unittest.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

doctest と同様に -v オプションを付けて実行すると詳細なログを出力してくれる。

>python study_unittest.py -v
test_heisei2seireki (__main__.TestSample) ... ok

----------------------------------------------------------------------
Ran 1 test in 0.002s

OK

またこちらの記事がわかりやすかったので参考にさせていただきました。
[Python] ユニットテストをPythonで書く - YoheiM .NET