Python.use(better)テストケースを生成するコード
Python.use(better)
テストケースを生成するコード《Jython2.5.0》
♪スタッフ研修用のセミナー教材(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...
》作業中です《