python doctest

python

pythonのテスト方法の一つであるdoctestを使ってみたいと思います。

コードの書き方と実行方法

step1 

以下の箇所に2行追加する。こちらでimportしているのは他のファイルから参照される時はテストがうごかにようにするためです。

if __name__ == '__main__': 
    import doctest     # ←追加箇所
    doctest.testmod()  # ←追加箇所
step2

コメントの中に、>>>でテストパターンを記載する。以下の例であれば、クラスを定義し、その中の処理を実行する。>>>の後に期待値を記載する。

class Cal_Test(object):
    """[summary]
       Args: object ([type]): [description] 
    >>> c = Cal_Test()    #テストコード箇所
    >>> c.add_num(2,2)    #テストコード箇所
    4             #期待値
    """
    def add_num(self, x, y): 
        result = x + y 
        return result
step3

step1,step2を記載したpythonファイルを実行する。

例:test.pyの場合

$python test.py

doctestを実行した際の出力

エラーがない場合は、基本何も出力されない。

期待値を4⇨5に書き換えNGパターンを作ると以下が出力される。

**********************************************************************
File "ファイルパス", 行数, in 関数
Failed example:
    c.add_num(2,2) # NG箇所
Expected:
    5               # 期待値     
Got:
    4               # 出力    
**********************************************************************

エラーがない場合も-vオプションをつけることでテスト結果を出力可能。

・コマンド

$python test.py -v

・出力

Trying:
    c = Cal_Test()
Expecting nothing
ok
Trying:
    c.add_num(2,2)
Expecting:
    4
ok
2 items had no tests:
    __main__
    __main__.Cal_Test.add_num
1 items passed all tests:
   2 tests in __main__.Cal_Test
2 tests in 3 items.
2 passed and 0 failed.
Test passed.

もしくは、dockets.testmod()で引数をverbose=Trueにすることでも同様の結果が得られる。

if __name__ == '__main__':
    import doctest
    doctest.testmod(verbose=True) # 指定箇所

エラーケースでの期待値

テストケースとして、エラー系の場合もみたいと思います。今回で言うと以下のように引数がない場合を例に見て行きます。

>>> c.add_num()

エラーとしては以下が出ます。

     Traceback (most recent call last):
      File "/usr/local/var/pyenv/versions/3.9.1/lib/python3.9/doctest.py", line 1336, in __run
        exec(compile(example.source, filename, "single",
      File "<doctest __main__.Cal_Test[2]>", line 1, in <module>
        c.add_num()
    TypeError: add_num() missing 2 required positional arguments: 'x' and 'y'

パスや何行目でエラーが出ている等の情報が出ています。これらの情報を全て期待値と記載することもできますが、ファイルによってパスや行数が変わる場合があると思います。その場合、以下のように確認したい箇所以外は...で省略可能です。

    Traceback (most recent call last):
    ...
    TypeError: add_num() missing 2 required positional arguments: 'x' and 'y'

実際、結果が表示できるよう-vオプションをつけて出力してみると以下のようになります。結果としてokが出ていることが確認できます。

Trying:
    c.add_num()
Expecting:
    Traceback (most recent call last):
    ...
    TypeError: add_num() missing 2 required positional arguments: 'x' and 'y'
ok

まとめ

pythonでテストを書く方法の一つであるdoctestを試してみました。個人的には、簡単にテストがかけるので便利だとは感じたのですがコメント部分が長くなるため、全てのパターンのテストをこれで実施するのは厳しいと思いました。コメント文が長くなるため、コードが読みづらいと考えます。なので、関数の使い方を数パターン記載してみたり、簡単な動作確認時に使うのがいいのではと思いました。

コメント

タイトルとURLをコピーしました