Python.use(better)テストケースを生成するコード

記事一覧入門編基礎編応用編中級編

Python.use(better)
テストケースを生成するコード《Jython2.5.0》

《著》小粒ちゃん+∞《監修》小泉ひよ子とタマゴ倶楽部
第0版♪2001/03/02 ● 第1版♪2003/05/25 ● 第2版♪2004/06/01 ● 第3版♪2009/02/28

♪スタッフ研修用のセミナー教材(2003)に加筆(再構成)して、公式マニュアルの補足情報を提供します。

25.2. doctest — Test interactive Python examples ★★

「テストケースを生成するコード」を記述する方法を紹介します。

ここでは、基本的なアプローチとして「共通項を抽出してひとつにまとめる」リファクタリングの定石に従います。前述したテストケース ex_1 には、いくつかの共通点と相違点があります。

まず、テストの対象となるメソッド find は同じです。次に、テストの対象となる文字列 "ABC" も同じです。違いは、実引数とそのリターン値です。テストケース ex_2 についても、対象となるメソッド index は違っても、その状況は同じです。そこで、これらの違いを捨象できたなら、抽象表現が可能になることが分かります。

それには、メタプログラミングの基本ツールとして組み込み関数 eval/compile を利用します。

def ex_1():
    for e in "ABC@":
        X = '"ABC".find(%r)'%e
        print ">>>",X
        eval(compile(X,"","single"))

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

>>> ex_1()
>>> "ABC".find('A')
0
>>> "ABC".find('B')
1
>>> "ABC".find('C')
2
>>> "ABC".find('@')
-1

ここで、2行目以降は(プロンプトと同じ文字列 >>> が含まれますが、これも)出力された結果であることに、注意してください。

def ex_2():
    for e in "ABC@":
        X = '"ABC".index(%r)'%e
        print ">>> try:"
        print "...    ",X
        print "... except ValueError,e:"
        print "...     print e"
        try:            
            eval(compile(X,"","single"))
        except ValueError,e:
            print e

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

>>> ex_2()
>>> try:
...     "ABC".index('A')
... except ValueError,e:
...     print e
0
>>> try:
...     "ABC".index('B')
... except ValueError,e:
...     print e
1
>>> try:
...     "ABC".index('C')
... except ValueError,e:
...     print e
2
>>> try:
...     "ABC".index('@')
... except ValueError,e:
...     print e
substring not found in string.index

ここでは、例外処理を含む try/except プロックが含まれることに、注意してください。

■ 何が問題か

しかし、類似する「テストケースを生成するコード」を何度も記述するのは面倒です。そこで「《テストケースを生成するコード》を生成するコード」を記述する方法を紹介します。

TO BE CONTINUED...


》作業中です《






Last updated♪2009/07/25