《余録》テストケース〈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