Keep on moving

あんまりまとまってないことを書きますよ

unittest2でテストスキップする

テストを特定の条件の場合のみ実行できるようにしたい。

unittest2(python2.7,python3.2以降だとunittest)だとunittest2.skipという機能が追加されました。

http://www.voidspace.org.uk/python/articles/unittest2.shtml

こんな感じ

platform = 'linux' if sys.platform.startswith('linux') else sys.platform

@skip("skip this test")
def test_method(self):
    ...

@skipIf(platform == "win32", "win32ではテストしない")
def test_method(self):
    ...

@skipUnless(platform == "win32", "win32のみテスト")
def test_method(self):
    ...

# classにも使える
@skipIf(platform == "win32", "win32ではテストしない")
class TestSequenceFunctions(unittest2.TestCase):
    def setUp(self):
        self.seq = range(10)
    def test_shuffle(self):
        ...

でも同じメッセージを出す場合、毎回同じメッセージ書くのはだるいですよね。
メッセージを変数に格納するにしても毎回設定するのもめんどいです。
そこで

wrapしちゃえ!

こんな感じ

# decorator for class
def platform_skip(platform_list):
    def _inner(obj):
        return obj
    if platform in platform_list:
        return unittest2.skip("Test disabled in the current platform")
    return _inner

@platform_skip(["win32", "darwin"])
class TestSequenceFunctions(unittest2.TestCase):
        ...

まとめ

実はやってみるまでデコレーターのwrapができるとは思ってなかったのですが、割と何とかなるものですね。
Python書くのは楽しいです!