2006/05/21 PythonのDocTestでお手軽TDD

Category: 'python', 'Programming'

『Python凄いんですか?』

『詳しくは知らないんですが、doctestというのが凄そうです』

機械猫の日記 - 第15回XPJUGユーザ会 のコメント欄より

PythonのDocTestで手軽にUnitTestを書く事が出来ます。こいつの 凄い ところは、

  • 実装とドキュメントとテストが一カ所に集中する(生き別れない)
  • テストコードが言語レベルでマニュアルとして利用される
  • インタラクティブモード(対話コンソール)の内容を貼り付ければテストになる

というところです。まああんまり書きすぎると実装がドキュメント(UnitTest)に埋もれちゃう、という話もありますが、そのへんはバランスを取って書くということで。

それでは早速DocTestを書いてみます。(vnc2swf - 画面録画ユーティリティ を使ってFlash作ってみました)

コードだけだと分からないと思うので、使い方等、詳しくはFlashの方を見てください。

def add(x, y):
    """ return added value.

    add digits.

    >>> add(1, 2)
    3

    add strings.

    >>> add('abc', '123')
    'abc123'
    """
    return x + y

def evens(digits):
    """ return even value's list.

    >>> evens([1, 2, 3, 4, 5, 6])
    [2, 4, 6]
    >>> evens([1, 3])
    []
    >>> evens(range(0, 10))
    [0, 2, 4, 6, 8]

    """
    return [x for x in digits if x%2==0]

# make and return TestSuite for this module.
def test_suite():
    import unittest
    from doctest import DocTestSuite
    return unittest.TestSuite(( # make test suite
        DocTestSuite('my_utils'), # register myself as test
        ))

# This if statement is executed only when run this module as main module.
if __name__ == '__main__':
    import unittest
    unittest.main(defaultTest='test_suite') # execute test.