テストケースのロードを自動化した
テストコードを今まで個別に実行してましたが、ファイルが増えてきた(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
とりあえず、今ある知識からこのような対処をしたわけですが、もっと望ましい方法があるかもしれません。