Unittest setUp / tearDown для нескольких тестов - PullRequest
103 голосов
/ 05 декабря 2011

Есть ли функция, которая запускается в начале / конце сценария испытаний? Функции setUp и tearDown запускаются до / после каждого теста.

Обычно я хотел бы иметь это:

class TestSequenceFunctions(unittest.TestCase):

    def setUpScenario(self):
        start() #launched at the beginning, once

    def test_choice(self):
        element = random.choice(self.seq)
        self.assertTrue(element in self.seq)

    def test_sample(self):
        with self.assertRaises(ValueError):
            random.sample(self.seq, 20)
        for element in random.sample(self.seq, 5):
            self.assertTrue(element in self.seq)

    def tearDownScenario(self):
        end() #launched at the end, once

На данный момент эти setUp и tearDown являются модульными тестами и распространяются во всех моих сценариях (содержащих много тестов), один - первый тест, другой - последний тест.

Ответы [ 3 ]

123 голосов
/ 05 декабря 2011

По состоянию на 2.7 (за документацию ) вы получаете setUpClass и tearDownClass, которые выполняются до и после выполнения тестов в данном классе, соответственно. Кроме того, если у вас есть группа из них в одном файле, вы можете использовать setUpModule и tearDownModule ( документация ).

В противном случае лучше всего будет создать собственный производный TestSuite и переопределить run(). Все другие вызовы будут обрабатываться родителем, и run будет вызывать ваш код установки и разрыва вокруг вызова вплоть до метода run родителя.

44 голосов
/ 12 июля 2016

У меня тот же сценарий, для меня методы setUpClass и tearDownClass работают отлично

import unittest

class Test(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls._connection = createExpensiveConnectionObject()

    @classmethod
    def tearDownClass(cls):
        cls._connection.destroy()
1 голос
/ 11 сентября 2017

Для python 2.5, и при работе с pydev это немного сложно. Похоже, что pydev не использует набор тестов, но находит все отдельные тестовые случаи и запускает их все отдельно.

Мое решение для этого было использовать переменную класса, как это:

class TestCase(unittest.TestCase):
    runCount = 0

    def setUpClass(self):
        pass # overridden in actual testcases

    def run(self, result=None):
        if type(self).runCount == 0:
            self.setUpClass()

        super(TestCase, self).run(result)
        type(self).runCount += 1

С помощью этого трюка, когда вы наследуете от этого TestCase (а не от исходного unittest.TestCase), вы также наследуете runCount от 0. Затем в методе run runCount дочерний тестовый случай проверяется и увеличивается. Это оставляет переменную runCount для этого класса в 0.

Это означает, что setUpClass будет выполняться только один раз для каждого класса, а не один раз для каждого экземпляра.

У меня пока нет метода tearDownClass, но я думаю, что-то можно сделать с помощью этого счетчика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...