Python

【Python】docstringを使って関数をテストする方法を解説【doctest】

この記事では、Pythonのdocstringを使ってテストする方法を解説します。docstringは説明や概要を書いたりしてドキュメントを作成するためのものですが、doctestモジュールを使うことで実行例を書いて正常に動作するかテストさせることもできます。

doctestモジュールは主に以下の目的で使われる。

  • docstringが最新かチェックする
  • 回帰テストできる
  • 書いたテストが使い方の例になる

docstringの書き方は以下の記事を参照してください。

【Python】ドキュメンテーション文字列の書き方を解説【docstring】この記事では、Pythonのドキュメンテーション文字列の使い方を解説します。ドキュメンテーション文字列を定義することで、関数やクラスなどに目的や機能がわかるように説明文を記述することができます。また、ドキュメンテーション文字列を用いてテストを行うこともできます。それでは、ドキュメンテーション文字列の使い方を見ていきましょう!...

それでは、docstringを使ってテストする方法を見ていきましょう!

docstringでテストするには…

ドキュメンテーション文字列を用いてテストするにはdoctestモジュールを使用します。docstringに記述した対話実行例の通りに動作するか検証することができます。

doctestは標準ライブラリなのでインポートするだけで使用可能です。

import doctest

対話実行例の書き方

docstring中に関数の呼び出しと期待される出力を記述します。

def div(a, b):
    """
    >>> div(4, 2)
    2.0
    """
    return a / b

>>>div(4, 2)が呼び出しで、その下の2.0が期待される出力です。

また、期待される出力にエラーを記述することもできます。

def div(a, b):
    """
    >>> div(4, 2)
    2.0
    >>> div(0, 0)
    Traceback (most recent call last):
        ...
    ZeroDivisionError: division by zero
    """
    return a / b

こういった呼び出し方がされたらこの結果が返る というパターンを増やしていくことでさらに強固なテストを作成することができます。

doctestをチェックする方法

テストを実行するには同モジュール内の最後に以下のコードを記述し、

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

コマンドラインから直接実行します。

$ python モジュール名.py

テストしてみる

実際にdoctestを使ってテストしてみて成功する場合と失敗する場合の挙動の違いを確認していきましょう。

実行例が成功する場合

実行例が正しい場合のdocstringを試してみます。

div.py

def div(a, b):
    """
    >>> div(4, 2)
    2.0
    """
    return a / b


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

このコードをコマンドラインから実行します。

$ python div.py

実行例が成功すると特に何も表示されません。

実行例が失敗する場合

実行例が間違っている場合のdocstringを試してみます。

div.py

def div(a, b):
    """
    >>> div(4, 2)
    2
    """
    return a / b


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

このコードを実行すると、以下のような出力がされます。

$ python div.py
**********************************************************************
File "div.py", line 5, in __main__.div
Failed example:
    div(4, 2)
Expected:
    2
Got:
    2.0
**********************************************************************
1 items had failures:
   1 of   1 in __main__.div
***Test Failed*** 1 failures.

docstringに記述した期待される出力がExpectedで、実際に出力された値がGotです。

実行例ではint型の値が返ってくると記述していましたが、実際に返ってきた値はfloat型だったのでテストが失敗し、予想した挙動になっていないことがわかりました。

まとめ

この記事では、docstringを使ってコードをテストする方法を解説しました。

色々なテスト方法がありますが、doctestはテストするコードと実行例が同じ場所にあるのでわかりやすい反面、関数などに直接書くことになるのでコードが長くなってしまいます!

テストが長くなってしまう場合はunittestなどを使いましょう!

【Python】unittestを使ってテストを書く方法テストを実装することで将来コードが複雑になっても、そのコードが期待通りに動作することを保証してくれます。またコードを見直す際にテストを見ることで動作をまとめて見ることができます。ここにわかりやすくコメントを書いておくことでコードを理解するのにも役立ちます。...

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ

最短3か月でエンジニア転職『DMM WEBCAMP COMMIT』