[Python]doctestをサクッとやってみる

python

Pythonの標準ライブラリに含まれているdoctestをさっくりやってみます。

doctestとは?

docstringの中にテストを書き対話型インタープリタのようにテストを実行することができます。

実際にdoctestを使ってみます。

 

doctestをやってみる

かなり簡単な例として2つの数値を掛けるコードを書いてみます。

class Double(object):
    def double(self, x, y):
    result_double = x * y
    
    return result_double

これにdoctestを付けてみます。

doctestの書き方としては以下のように書きます。

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

これはこのファイルを直接実行した時だけ、doctestを行うコードです。

Pythonの__name__と__main__について

 

そして、肝心のテスト部分は対話型インタープリタのように記載することができます。

実際に上記のコードにdoctestを書いてみます。

class Double(object):
    def double(self, x, y):
        """ num double
        >>> d = Double()
        >>> d.double(1, 2)
        3
        """
        result_double = x * y

        return result_double


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

“””で囲んだ中にインタープリタのように書くことができます。そのメソッドがどのような動きをするのかをコメントで書けます。

 

>>>を使いインタープリタのように実行コードを書いていきます。

1行目:クラスをインスタンス化

2行目:引数に1と2を入れて関数を実行。

そして、3行目で実行結果の予想を入れます。ここではあえてエラーを吐き出させるために1 * 2の結果は3と入力しました。

ファイルを実行します。(前後しましたがファイル名はtest.pyとします)

python test.py

Failed example:
    d.double(1, 2)
Expected:
    3
Got:
    2

Expectedの部分は自身が入力した「予想」です。(expect=予想する)しかし、結果は2となっているのでテストをパスしません。

ここで予想の部分を2に変えて実行すると何も起こりません。これはテストをパスしたという意味です。

 

オプションを付けて何が起きたかを見る

テストがパスタした場合、エラーは吐き出されず何も起こりません。

ここでverboseオプションを使ってみます。ちなみにverboseという英語は「冗長な」という意味がありますが、プログラミング用語としてはデフォルトでは出力されない詳細な処理を表示するという意味合いがあるようです。

python test.py -v

Trying:
    d = Double()
Expecting nothing
ok
Trying:
    d.double(1, 2)
Expecting:
    2
ok
...以下、略

インタープリタ形式で書いたコードを上から順に実行しています。

 

doctestは全てのクラス、全ての関数を実行する

上で示した例では1つのクラスでしたが、doctestはファイル内にある全てのクラスと関数を実行します。ネストされたクラスについてもdoctestが実行されます。



カテゴリー