Java/Python 導入ガイド:swing/Jython - eval

Java プログラマーのための Python 導入ガイド記事一覧
swing/Jython - eval

《著》小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部
第1版♪2003/05/23 ● 第2版♪2009/04/03
》作業中です《

■ 概要

テストケースを手作業で記述するのは面倒なので、そのテストケースを作成するプログラムがあると便利です。

 試行錯誤によって得られたテストケースを、自動的に検証するモジュール 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)

>>> 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