Объясните методы Python «setUp» и «tearDown», используемые в тестовых примерах.

96

Может ли кто-нибудь объяснить использование методов Python setUpи tearDownпри написании тестовых примеров, кроме того, что setUpвызывается непосредственно перед вызовом метода тестирования и tearDownвызывается сразу после его вызова ?

НОВИЧЕК
источник

Ответы:

87

Обычно вы добавляете все необходимые шаги в setUp и все шаги по очистке в tearDown.

Вы можете прочитать больше с примерами здесь .

Когда определен метод setUp (), средство выполнения тестов будет запускать этот метод перед каждым тестом. Аналогичным образом, если определен метод tearDown (), средство выполнения тестов будет вызывать этот метод после каждого теста.

Например, у вас есть тест, который требует наличия элементов или определенного состояния, поэтому вы помещаете эти действия (создание экземпляров объектов, инициализацию базы данных, подготовку правил и т. Д.) В setUp.

Также, как вы знаете, каждый тест должен останавливаться в том месте, где он был запущен - это означает, что мы должны восстановить состояние приложения до его исходного состояния - например, закрыть файлы, соединения, удалить вновь созданные элементы, вызвать обратный вызов транзакций и так далее - все это шаги должны быть включены в tearDown.

Таким образом, идея состоит в том, что сам тест должен содержать только те действия, которые должны быть выполнены с объектом тестирования для получения результата, а методы setUp и tearDown помогут вам оставить код теста чистым и гибким.

Вы можете создать setUp и tearDown для группы тестов и определить их в родительском классе, чтобы вам было легко поддерживать такие тесты и обновлять общие приготовления и очистку.

Если вы ищете простой пример, воспользуйтесь следующей ссылкой с примером

Артем Рудзенко
источник
57

Их можно использовать для исключения кода, общего для всех тестов в наборе тестов.

Если в ваших тестах много повторяющегося кода, вы можете сделать их короче, переместив этот код в setUp / tearDown.

Вы можете использовать это для создания тестовых данных (например, для настройки фейков / моков) или для замены функций фейками.

Если вы проводите интеграционное тестирование, вы можете использовать предварительные условия проверки среды в setUp и пропустить тест, если что-то не настроено должным образом.

Например:

class TurretTest(unittest.TestCase):

    def setUp(self):
        self.turret_factory = TurretFactory()
        self.turret = self.turret_factory.CreateTurret()

    def test_turret_is_on_by_default(self):
        self.assertEquals(True, self.turret.is_on())

    def test_turret_turns_can_be_turned_off(self):
        self.turret.turn_off()
        self.assertEquals(False, self.turret.is_on())
Мэтт Кертис
источник
17
+1, потому что 9 строк кода - это все, что мне нужно для 100% грока. Элегантный, лаконичный пример. Честно говоря, эти 9 строк - единственное, что я прочитал на странице, кроме вопроса, который также был моим вопросом. Вы сказали что-то по-английски перед образцом кода? Это было не нужно! Код сказал все! Спасибо, Мэтт.
Натан С. Треш
3
Я не понимаю, как здесь демонстрируется «пропустить тест, если что-то не настроено должным образом». Или это было просто отступлением?
user5359531
6

Предположим, у вас есть набор из 10 тестов. 8 тестов используют один и тот же код установки / удаления. Остальные двое - нет.

setup и teardown дают вам хороший способ рефакторинга этих 8 тестов. Что вы будете делать с двумя другими тестами? Вы бы переместили их в другой тестовый набор / набор. Таким образом, использование настройки и разборки также помогает естественным образом разбивать тесты на кейсы / наборы.

Джон Ла Рой
источник
1
Иногда нежелательно переносить тесты в другой тестовый набор. В этом случае вы можете написать декоратор с кодом установки / удаления и украсить только желаемые тестовые функции.
Matthijs
2
Это ни в коем случае не ответ на вопрос.
Создан