《余録》テストケース〈Python 3.0 版〉

実録:はじめてのプログラミング記事一覧
《余録》テストケース

《著》小粒ちゃん+α《監修》小泉ひよ子とタマゴ倶楽部
第3版♪2009/02/28 ● 2009年2月9日(月)

》作業中です《

■ 概要

互換性のある新規モジュールを作成するときには、既存のテストケースを再利用するのが得策です。

 この課題では、組み込み型と互換性のある、新規モジュールを作成します。
 テストケースを自動的に検証するモジュール modtest を利用する前に、
 メタプログラミングを実践して、テストケース(コード)を生成するプログラム(コード)を作成します。

事例:テストケース(コード)を生成するコード

テストの重要性をここで説くまでもありませんが、そのテストケースを手作業で記述するのは面倒です。そこで、テストケース(コード)を生成するコードがあると便利です。

■ テストケースを出力するコード
def ex_index():
    X = 's = list("ABC"); s'
    print(">>>",X)
    eval(compile(X,"","single"))
    for e in "ABC@":
        X = "s.index(%r)"%e
        print(">>>",X)         # 入力
        print(eval(X))         # 出力

これは、対話モードによる入出力を想定したものです。実際に、

        X = "s.index(%r)"%e
        print(">>>",X)

組み込み型 list/s にメソッド index を適用するとともに、

        print(eval(X))

それを評価 eval した結果を出力しています。

>>> ex_index()

これを実行すると、次のような出力が得られます。

■ 出力されたテストケース
>>> s = list("ABC"); s
['A', 'B', 'C']
>>> s.index('A')
0
>>> s.index('B')
1
>>> s.index('C')
2
>>> s.index('@')
Traceback (most recent call last):
  File "", line 1, in 
  File "linkedList_ex.py", line 51, in ex_index
    print(eval(X))
  File "", line 1, in 
ValueError: list.index(x): x not in myList

これを見ると、あたかも「対話モードで実行した」かのような、出力になっているのが分かります。

つまり、この出力を、そのまま modtest の入力としても利用できます。そこで、この出力をコメントに転記するときに、少し手を加えます。

■ テストケースを編集する

新規モジュール myList は、組み込み型 list と互換性があるので、このテストケースを再利用できます。ただし、少し変更する必要です。

"""
>>> s = myList("ABC"); s
['A', 'B', 'C']
>>> s.index('A')
0
>>> s.index('B')
1
>>> s.index('C')
2
>>> s.index('@')
Traceback (most recent call last):
  File "", line 1, in 
  File "linkedList_ex.py", line 51, in ex_index
    print(eval(X))
  File "", line 1, in 
ValueError: myList.index(x): x not in myList
"""

まず、先の出力結果をコメント内に転記します。次に、テスト対象を list から myList へと変更します。これで、テストモジュールが完成します。後は、テストモジュールを実行して、結果を確認するだけです。

概観

テストモジュールは、次のように構成になっています。

#! /usr/bin/python3.0
## ----------------------------------------
"""
>>> s = myList("ABC"); s
['A', 'B', 'C']
                     #
                     # ここに ex_index() の出力結果を埋め込みます
                     #
>>> None
version #1.0.1
"""
## ----------------------------------------
def ex_index():
    X = 's = list("ABC"); s'
    print ">>>",X
                     #
                     # ここにテストケースを出力するコードを記述します
                     #

## ----------------------------------------
import   linkedList
module = linkedList     # テストケースを含むモジュール名を指定します

from doctest import testmod

if __name__=='__main__':
    testmod(module)

Tips

》作業中です《

Last updated♪09/05/12