テストを特定の条件の場合のみ実行できるようにしたい。
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書くのは楽しいです!