Короткий ответ
setUp выполняется перед каждым тестовым методом класса и готовит общее состояние (объекты, соединения), а tearDown выполняется после каждого теста и освобождает ресурсы, независимо от того, прошёл тест или упал.
Как это работает подробнее
unittest вызывает setUp перед вызовом каждого test_* метода этого класса, а tearDown — сразу после, даже если тест завершился исключением или неудачным assert, а не только при успешном завершении. Это гарантирует, что ресурсы (файлы, соединения, временные директории), открытые в setUp, не утекают между тестами и не накапливаются при большом наборе тестов.
Пример кода
testing_example_300.py
import unittest
class TestFileWriter(unittest.TestCase):
def setUp(self):
self.tmp_file = open("test_output.txt", "w")
def tearDown(self):
self.tmp_file.close()
def test_write_line(self):
self.tmp_file.write("hello")
self.assertTrue(self.tmp_file.writable())Что использовать на практике
- Практика. setUp/tearDown удобны для простых повторяющихся приготовлений в рамках одного класса тестов, но при более сложной иерархии зависимостей pytest-фикстуры с разным scope часто оказываются гибче, позволяя переиспользовать подготовку между разными классами и модулями без дублирования кода.
Подводные камни
- Риск. Делать tearDown зависимым от того, что setUp отработал полностью — если setUp упал на середине, часть ресурсов могла не создаться, и tearDown попытается закрыть несуществующий объект, порождая новую, маскирующую ошибку. Класть в setUp тяжёлые операции (например, реальный сетевой вызов или полную пересборку схемы БД), что сильно замедляет весь набор тестов.