テストケースのロードを自動化した

テストコードを今まで個別に実行してましたが、ファイルが増えてきた(20くらい)ので、メタクラス(TestMeta)を使って、テストケースを自動で集めて一度にすべてalltests.pyで実行するようにしました。

#!/usr/bin/env python2.7
# alltests.py
from test import test_support
from test_common import TestMeta
import imp
import glob
for fname in glob.glob('./*_test.py'):
  name = fname[2:-3]
  imp.load_source(name, fname)
test_support.run_unittest(*TestMeta.tests)

以下のように書くと、テストケースはunitttest.TestCaseの代わりに、test_common.TestMetaを__metaclass__に指定したtest_common.TestCaseを継承させれば、そのクラスはTestMeta.testsに追加されます。

# test_common.py
import unittest
class TestMeta(type):
  tests = []
  def __new__(msc, name, bases, d):
    cls = type.__new__(msc, name, bases, d)
    if name != 'TestCase':
      TestMeta.tests.append(cls)
    return cls
class TestCase(unittest.TestCase):
  __metaclass__ = TestMeta

例えば、ここのalltests.pyと同じディレクトリに次のようなファイルを追加して、'./alltests.py'を実行すると追加されたテストが実行されます。

import test_common
def class LoadTest(test_common.TestCase):
  def test_method(self): pass

とりあえず、今ある知識からこのような対処をしたわけですが、もっと望ましい方法があるかもしれません。