Теперь я сделал это, создав подкласс класса TestSuite, поскольку стандартный загрузчик упаковывает все методы test в экземпляр TestCase, в котором они определены, и объединяет их в TestSuite. У меня есть TestSuite для вызова методов before () и after () первого TestCase. Это, конечно, означает, что вы не можете инициализировать какие-либо значения для вашего объекта 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
Для немного более тонкого элемента управления я также создал пользовательский TestLoader, который гарантирует, что BeforeAfterSuite используется только для переноса объектов test-method-TestCase, который выглядит следующим образом:
class BeforeAfterLoader(unittest.TestLoader):
def loadTestsFromTestCase(self, testCaseClass):
self.suiteClass = BeforeAfterSuite
suite = unittest.TestLoader.loadTestsFromTestCase(self, testCaseClass)
self.suiteClass = unittest.TestLoader.suiteClass
return suite
Вероятно, здесь отсутствует блок try / исключением вокруг до и после, который может дать сбой всем тестам в наборе или что-то в этом роде.