UnitTest で Parametalized テストと TDDBC 大阪 2.0

TDDBC 大阪 2.0 に参加した。


Python で希望したけど、Python 希望者が自分一人だったので、TA の方とペアプロした。
テストコードを書いてたら TA の方にここは PHP でいうデータプロバイダーを使うと良いと指摘してもらった。
PHPUnit – The PHP Testing Framework


お題となるのが自動販売機プログラムで、10 円、50 円、100 円、500 円、1000 円を入れたら自販機にストアされ、
1 円、5 円、その他を入れると戻ってくるという場合。
# 課題の一部

class TestVendingMachine(TestCase):
    def setUp(self):
        self.vm = VendorMachine()
        self.money = self.vm.available_money
    def test_add_money(self):
        """ 硬貨、紙幣を投入できる """
        for m in [10, 50, 100, 500, 1000]: 
            self.assertEqual(self.vm.add_coin(m), None)

とか書いていた。ここをループを回さずに書きましょうと。
# 追記:2012/06/08

py.test を使うとパラメタライズテストがかけるけど、unittest の場合はサポートされてないよう。
# 時間中に上手くできなかったので家に帰って調べた


ググったらこれが見つかった。
[python][xunit]PythonのParameterized Test - logging.info(self)
試しに実装してみたら、テストコードが実行出来なかった。
更にググる
unit testing - python unittest: can't call decorated test - Stack Overflow
functools.wraps を使えとある。

def paramterized(**kwargs):
    def _paramterized_test(func):
        @wraps(func)
        def __paramterized_test(*args):
            func(args[0], kwargs)
            return func
        return __paramterized_test
    return _paramterized_test

class TestVendingMachine(TestCase):
    def setUp(self):
        self.vm = VendorMachine()
        self.money = self.vm.available_money

    @paramterized(param=10, expected=None)
    @paramterized(param=50, expected=None)
    @paramterized(param=100, expected=None)
    @paramterized(param=500, expected=None)
    @paramterized(param=1000, expected=None)
    def test_paramterize1d(self, params):
        """ 硬貨、紙幣を投入できる """
        self.assertEqual(self.vm.add_coin(params['param']), params['expected'])

というコートで実行できるようになった。

TDDBC 大阪 2.0 の感想

関西で初めて開催されたという事であっというまに土曜日の枠が埋まり、追加で日曜日の開催となった。
見た感じ希望言語に Java が多かったよう。
Python(自分一人)、PHP(もう一人)、JavaScript(2 人)、Ruby(2 人)って感じだった。
その他は Java(Groovy), C, C++, C# だったよう。


テストコード自体は書いているが、TDD をやってるわけではないので、色々振り返る事が出来て良かった。
またペアプロでコードレビューをしながらコードを書くのは初めての事だったので新鮮だった。
ペアプロの TA の方も幸い Vim ユーザで QuickRun を使ってらっしゃるようなのでとても楽だった。


トークセッションで DB を使った場合のテストはモックを使う?という質問があって、殆どの方が実際の DB を使うという回答だったのが印象深かった。
同じようにテスト用の DB を構築して、setUp でスキーマからデータ登録して、tearDown でクリアしているやり方に自信が持てた。


こういう一日ガッツリ手を動かすイベントに久々に参加してとても疲れたが、それ以上の収穫があったので参加してよかった。