Как я могу создать тестовое устройство в области классов в pyUnit? - PullRequest
2 голосов
/ 02 февраля 2011

Я тестирую модульную интеграцию Mercurial и у меня есть тестовый класс, который в настоящее время создает репозиторий с файлом и клоном этого репозитория в своем методе setUp и удаляет их в своем tearDown метод.

Как вы, вероятно, можете себе представить, это очень сильно увеличивает производительность, особенно если мне приходится делать это для каждого теста индивидуально.
Итак, я хотел бы создать папки и инициализировать их дляmercurial при загрузке класса, поэтому каждый юнит-тест в классе TestCase может использовать эти репозитории.Затем, когда все тесты будут запущены, я бы хотел их удалить.Единственное, о чем должны заботиться мои методы setUp и tearDown , - это то, что оба репозитория находятся в одном и том же состоянии между каждым тестом.

В основном то, что я 'я ищу python эквивалент JUnit @BeforeClass и @AfterClass аннотаций.

Ответы [ 2 ]

2 голосов
/ 09 февраля 2011

Теперь я сделал это, создав подкласс класса 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 / исключением вокруг до и после, который может дать сбой всем тестам в наборе или что-то в этом роде.

1 голос
/ 25 марта 2013

из документации о тестировании модулей Python :

setUpClass ():

Метод класса, вызываемый перед тестами в отдельном запуске класса.setUpClass вызывается с классом в качестве единственного аргумента и должен быть оформлен как classmethod ():

@classmethod
def setUpClass(cls):
...

Новое в версии 2.7.

tearDownClass ():

Метод класса, вызываемый после выполнения тестов в отдельном классе.tearDownClass вызывается с классом в качестве единственного аргумента и должен быть оформлен как classmethod ():

@classmethod
def tearDownClass(cls):
    ...
...