2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

選択的にテストを実行する

Last updated at Posted at 2016-08-15

やりたいこと

テストの部分集合のみを実行したい場合、例えば時間がかかるテストを普段はスキップし、指定した場合のみ実行したい。一つの方法としては、ファイル単位で分割してファイル名で区別できるようにしておき、 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
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?