今日の内容は、Pythonでテストしたいにまとめている内容の詳細部分です。

doctestを触ってみました。

sample.py

"""
値を1増加させる関数です
>>> add_one(1)
2
"""


def add_one(x):
    """
    値が1増加します
    >>> [add_one(x) for x in range(5)]
    [1, 2, 3, 4, 5]
    """
    return x + 1


if __name__ == '__main__':
    import doctest
    doctest.testmod()

実行する

$ python sample.py

正常に動作した場合はなにも表示されない

sample.pyの14行目を return x + 2 と書き換えて実行

$ python sample.py 
**********************************************************************
File "sample.py", line 3, in __main__
Failed example:
    add_one(1)
Expected:
    2
Got:
    3
**********************************************************************
File "sample.py", line 11, in __main__.add_one
Failed example:
    [add_one(x) for x in range(5)]
Expected:
    [1, 2, 3, 4, 5]
Got:
    [2, 3, 4, 5, 6]
**********************************************************************
2 items had failures:
   1 of   1 in __main__
   1 of   1 in __main__.add_one
***Test Failed*** 2 failures.

エーラーが出ます。 正しい場合も実行時にオプション -v をつけるとテストの詳細が表示されます。

$ python sample.py -v
Trying:
    add_one(1)
Expecting:
    2
ok
Trying:
    [add_one(x) for x in range(5)]
Expecting:
    [1, 2, 3, 4, 5]
ok
2 items passed all tests:
   1 tests in __main__
   1 tests in __main__.add_one
2 tests in 2 items.
2 passed and 0 failed.
Test passed.

別のファイルにも書き出せるようです。

sample.txt

The ``sample`` module
==========================
Using ``add_one``
------------------------
First import ``add_one`` from the ``sample`` module:

    >>> from sample9 import add_one

Now use it:

    >>> add_one(1)
    2

sample.py

def add_one(x):
    return x + 1


if __name__ == '__main__':
    import doctest
    doctest.testfile("sample.txt")

実行

$ python sample.py -v
Trying:
    from sample import add_one
Expecting nothing
ok
Trying:
    add_one(1)
Expecting:
    2
ok
1 items passed all tests:
   2 tests in sample.txt
2 tests in 1 items.
2 passed and 0 failed.
Test passed.

簡単な機能の関数のテストならこれで充分ですね。

参考リンク

公式ドキュメント: doctest — 対話的な実行例をテストする

参考図書