unittestモジュールでparameterized test

最近は、Pythonのテストフレームワークっていうとnoseがいいとか、py.testがいいとか色々聞きますが、Bazaarのテストライブラリはunittest + testtoolsベースなので、プラグインとかを作ろうと思うとその辺を使うことになります。

ある程度は我慢するとしても、parameterized testも書けない*1のはさすがに厳しいので、それっぽく書けるようにならないか試してみました。

で、書いてみたのがこれ。
parameterized.py

使い方はこんな感じ。

D:\TEMP\test>python test.py -v
test_add1_A (__main__.TestSample) ... ok
test_add1_B (__main__.TestSample) ... ok
test_add1_C (__main__.TestSample) ... FAIL
test_add2_A (__main__.TestSample) ... ok
test_add2_C (__main__.TestSample) ... FAIL
test_success (__main__.TestSample) ... ok

======================================================================
FAIL: test_add1_C (__main__.TestSample)

                                                                                                                                          • -

Traceback (most recent call last):
File "D:\TEMP\test\parameterized.py", line 55, in new_method
m(self, *a, **k)
File "test.py", line 19, in add1
self.assertEqual(a + b, result)
AssertionError: 3 != 4

======================================================================
FAIL: test_add2_C (__main__.TestSample)

                                                                                                                                          • -

Traceback (most recent call last):
File "D:\TEMP\test\parameterized.py", line 52, in new_method
self.assertEqual(ret, expected)
AssertionError: 3 != 4
Ran 6 tests in 0.010s

FAILED (failures=2)

大したことはしてなくて、ようするに

@param.hoge(1, 2)
def fuga(self, a, b):
    pass

みたいに書いたら、自動的に test_fuga_hoge っていうメソッドを生成してるだけです。
それっぽくはなったけど、レポート部分をもうちょっと頑張らないとあまりうれしくはないのだった。

もっとスマートな方法はないかなあ。

*1:書けないと思うんだけど、もしかして俺がしらないだけだろうか