Unittest setUp / tearDown для декількох тестів


118

Чи є функція, яка запускається на початку / в кінці сценарію тестів? Функції 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

Наразі ці налаштування та tearDown - це одиничні тести та розповсюджуються у всіх моїх сценаріях (містять багато тестів), один - перший тест, другий - останній тест.


6
Яка версія? Модуль unittest був розширений, включаючи модуль_setup і module_teardown в Python 2.7.
S.Lott

3
2.7 також запроваджено клас setUpClass () та tearDownClass (), який дозволить вам мати кілька класів в одному файлі з їх власною індивідуальною установкою та вилученням.
Пер Фагрелл

Відповіді:


132

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

В іншому випадку найкращим варіантом буде, можливо, створити власний похідний TestSuite та переотриматиrun() . Усі інші дзвінки будуть оброблятися з боку батьків, а запущені будуть викликати ваш код налаштування та відхилення навколо виклику до runметоду батьків .


71

У мене той самий сценарій, для мене методи setUpClass і tearDownClass прекрасно працюють

import unittest

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

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

6
Це слід оновити, щоб прийняти відповідь, оскільки він показує правильний приклад, і ці функції РОБОТИ бути класними методами для роботи, про що не йдеться у прийнятій відповіді.
NuclearPeon

1

Для 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), ви також успадковуватимете runCount0. Потім у методі run runCountперевіряється та збільшується дочірня тестова шафа. Це залишає runCountзмінну для цього класу 0.

Це означає, що setUpClassзаповіт буде виконуватися лише один раз за клас, а не один раз за екземпляр.

У мене ще немає tearDownClassметоду, але я думаю, що щось можна зробити за допомогою цього лічильника.


0

Ось приклад: 3 методи тестування мають доступ до спільного ресурсу, який створюється один раз, а не за тест.

import unittest
import random

class TestSimulateLogistics(unittest.TestCase):

    shared_resource = None

    @classmethod
    def setUpClass(cls):
        cls.shared_resource = random.randint(1, 100)

    @classmethod
    def tearDownClass(cls):
        cls.shared_resource = None

    def test_1(self):
        print('test 1:', self.shared_resource)

    def test_2(self):
        print('test 2:', self.shared_resource)

    def test_3(self):
        print('test 3:', self.shared_resource)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.