Java/Python 導入ガイド:swing/Jython - eval
Java プログラマーのための Python 導入ガイド《記事一覧》
swing/Jython - eval
《著》小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部
第1版♪2003/05/23 ● 第2版♪2009/04/03
》作業中です《■ 概要
テストケースを手作業で記述するのは面倒なので、そのテストケースを作成するプログラムがあると便利です。
試行錯誤によって得られたテストケースを、自動的に検証するモジュール modtest は重宝します。 しかし、膨大な数のテストケースを手作業で作成するのは面倒です。 メタプログラミングを実践して、テストケース(コード)を生成するプログラム(コード)を作成します。
■ 関連記事
- Creating a GUI with JFC/Swing, How to Use Lists
- 実録 はじめての…《27》検索:メソッド index - 続・ひよ子のきもち
事例:テストケース(コード)を生成するコード
テストの重要性をここで説くまでもありませんが、そのテストケースを手作業で記述するのは面倒です。そこで、テストケース(コード)を生成するコードがあると便利です。
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) >>> 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 "list_ex.py", line 36, in ex_index print eval(X) File " ", line 1, in ValueError: list.index(x): x not in list
これを見ると、あたかも「対話モードで実行した」かのような、出力になっているのが分かります。つまり、この出力を、そのまま modtest の入力としても利用できます。そこで、この出力をコメントに転記するだけで、テストモジュールが完成します。後は、テストモジュールを実行して、結果を確認するだけです。
モジュール modtest
import list_ex
module = list_ex
from doctest import testmod
def ex():
reload(module)
testmod(module)
if __name__=='__main__':
testmod(module)
■ テスト結果
テストケースを含むモジュール list_ex.py を実行すると、次のようなテスト結果が出力されます。
$ jython2.5b3 -i list_ex.py ********************************************************************** File "/Users/sketch/home_Jython/_myHome/PyoSwing/_pyoSwing/ex_testmod/list_ex.py", line 19, in list_ex Failed example: None Expected: version #1.0.1 Got nothing ********************************************************************** 1 items had failures: 1 of 6 in list_ex ***Test Failed*** 1 failures.
ここでは、6 件中に 1 件の不具合が発生しています。最後のテストケースは、意図的に組み込んだものです。「この猫はネズミを捕まえるか」と同様に、エラーケースを不具合として「正しく」認識できるかを確認する必要があります。よって、他のテストケースはすべて合格だと分かります。
概観
テストモジュールは、次のように構成になっています。
#! /usr/bin/jython2.5b3 ## ---------------------------------------- """ >>> s = list("ABC"); s ['A', 'B', 'C'] # # ここに ex_index() の出力結果を埋め込みます # >>> None version #1.0.1 """ ## ---------------------------------------- def ex_index(): X = 's = list("ABC"); s' print ">>>",X # # ここにテストケースを出力するコードを記述します # ## ---------------------------------------- import list_ex module = list_ex # テストケースを含むモジュール名を指定します from doctest import testmod def ex(): reload(module) testmod(module) if __name__=='__main__': testmod(module)
Tips
既存の仕様に準拠した新たなモジュールをテストするときには、既存のテストケースをそのまま再利用できるので、アジャイル開発を促進します。
》作業中です《
Last updated♪09/05/12