PYTHON MEBY

Pythonでdoctestを使ってドキュメントテスト

この記事では、Pythonのdoctestモジュールを使用して、ドキュメントとテストコードを同時に記述する方法を説明します。doctestを使うことで、コードの動作を明確に示し、テストを容易に行うことができます。

目次

doctestの概要

doctestモジュールは、Pythonコードのdocstringの中にテストケースを記述し、実行できるモジュールです。 docstring内に期待される入出力例を記述することで、コードの動作を明確に示し、自動テストを行うことができます。

def add(x, y):
  """足し算を行う関数

  >>> add(2, 3)
  5
  >>> add(-1, 1)
  0
  """
  return x + y

シンプルな例

シンプルな関数の例を見てみましょう。docstring内に期待される入出力例を記述します。

def square(x):
  """数値の二乗を計算する関数

  >>> square(2)
  4
  >>> square(-3)
  9
  """
  return x * x
import doctest
doctest.testmod()

より複雑な例

複雑なデータ構造や条件分岐を含む関数でもdoctestを使用できます。

def is_even(n):
    """数値が偶数かどうかを判定する関数

    >>> is_even(2)
    True
    >>> is_even(3)
    False
    >>> is_even(0)
    True
    """
    return n % 2 == 0
import doctest
doctest.testmod()

setUpとtearDown

テストの前処理と後処理を行うには、setUpとtearDown関数を使用できます。

import doctest
import unittest

class TestMyFunctions(unittest.TestCase):
    def setUp(self):
        print("setUp")
        self.data = [1, 2, 3]

    def tearDown(self):
        print("tearDown")

    def test_add(self):
        self.assertEqual(add(2,3),5)

    def test_square(self):
        self.assertEqual(square(3),9)

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

テストの無視

doctest.IGNORE_EXCEPTION_DETAILフラグを使用して、特定の例外の詳細を無視できます。

import doctest

def my_function():
    """何らかの処理を行う関数
    >>> my_function()
    Traceback (most recent call last):
        ...
    Exception: Some Error
    """
    raise Exception("Some Error")

doctest.testmod(optionflags=doctest.IGNORE_EXCEPTION_DETAIL)

doctestの実行方法

コマンドラインからdoctestを実行するには、python -m doctest your_module.py を実行します。

IDEやテストランナーでも実行可能です。多くのエディタやIDEは、doctestを直接実行する機能を提供しています。

利点と欠点

利点: * ドキュメントとテストコードを同時に記述できる * テストケースがコードと一緒にメンテナンスされる * 読みやすい 欠点: * 複雑なテストケースには向かない * テストの記述に制約がある * テストカバレッジが低い場合がある

関連記事