ここでは、TestSuite クラスをサブクラス化することでこれを行いました。これは、標準のローダーがすべてのテスト メソッドを、それらが定義されている TestCase のインスタンスにラップし、それらを TestSuite にまとめるからです。最初の TestCase の before() および after() メソッドを TestSuite に呼び出させます。もちろん、これは TestCase オブジェクトに値を初期化できないことを意味しますが、とにかく setUp でこれを実行したいでしょう。
TestSuite は次のようになります。
class BeforeAfterSuite(unittest.TestSuite):
def run(self, result):
if len(self._tests) < 1:
return unittest.TestSuite.run(self, result)
first_test = self._tests[0]
if "before" in dir(first_test):
first_test.before()
result = unittest.TestSuite.run(self, result)
if "after" in dir(first_test):
first_test.after()
return result
もう少し細かい制御のために、BeforeAfterSuite が test-method-TestCase オブジェクトをラップするためにのみ使用されるようにするカスタム TestLoader も作成しました。これは次のようになります。
class BeforeAfterLoader(unittest.TestLoader):
def loadTestsFromTestCase(self, testCaseClass):
self.suiteClass = BeforeAfterSuite
suite = unittest.TestLoader.loadTestsFromTestCase(self, testCaseClass)
self.suiteClass = unittest.TestLoader.suiteClass
return suite
おそらく、スイート内のすべてのテストケースが失敗する可能性がある before と after の周りの try/except ブロックが欠落しています。