やりたいこと
テストの部分集合のみを実行したい場合、例えば時間がかかるテストを普段はスキップし、指定した場合のみ実行したい。一つの方法としては、ファイル単位で分割してファイル名で区別できるようにしておき、 unittest モジュールの discovery のオプション
% python -m unittest --help
...
-p pattern Pattern to match test files ('test*.py' default)
を使って実現出来るが、ここでは
- ファイル名によらずに制御したい
- 実行対象の分類が変わったときにテストコードの移動をしたくない
- ファイル単位での分割をしたくない
- ファイル内の一部のクラス、一部のメソッドのみをスキップできるようにしたい
といったときの対処例を示す。
やりかた
unittest モジュールの skipIf, skipUnless デコレータを使う。例えば
util.py
import unittest
run_slowtest = False
def slowtest(target):
return unittest.skipUnless(run_slowtest, "Slow Test")(target)
のようにデコレータ関数を定義しておいて、class や method に付与しておく:
test_sample.py
import unittest
from util import slowtest
@slowtest
class TestA(unittest.TestCase):
def test_a(self):
pass
class TestB(unittest.TestCase):
@slowtest
def test_b(self):
pass
普通に実行すると対象のテストはスキップされる:
% python -m unittest discover .
ss
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK (skipped=2)
全部実行したい場合は次のようにする:
% cat runner_full.py
import unittest
import util
util.run_slowtest = True
unittest.TestProgram(argv=['', 'discover'])
% python runner_full.py
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK