В `unittest` фикстуры создаются методами `setUp` и `tearDown` (для каждого теста) или `setUpClass` и `tearDownClass` (один раз для класса).
setUp: Выполняется перед каждым тестом. Здесь создаются общие ресурсы, необходимые для тестов.
tearDown: Выполняется после каждого теста. Здесь освобождаются ресурсы, созданные в `setUp`.
setUpClass: Выполняется один раз перед всеми тестами в классе. Обычно используется для инициализации ресурсов, общих для всех тестов.
tearDownClass: Выполняется один раз после всех тестов в классе. Используется для освобождения ресурсов, инициализированных в `setUpClass`.
Пример:
import unittest
class MyTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.resource = "Общий ресурс"
print("setUpClass")
@classmethod
def tearDownClass(cls):
print("tearDownClass")
def setUp(self):
self.data = [1, 2, 3]
print("setUp")
def tearDown(self):
print("tearDown")
def test_something(self):
self.assertEqual(len(self.data), 3)
print("test_something")
def test_another(self):
self.assertEqual(self.resource, "Общий ресурс")
print("test_another")
В `unittest` фикстуры используются для настройки и очистки тестовой среды до и после выполнения тестов. Они обеспечивают повторяемость и изоляцию тестов, подготавливая общие ресурсы или данные, необходимые для работы тестов.
В `unittest` фикстуры реализуются с помощью специальных методов, которые вызываются автоматически фреймворком:
Пример:
import unittest
import os
class MyTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
# Создаем временную директорию для всех тестов в классе
cls.temp_dir = "temp_test_dir"
if not os.path.exists(cls.temp_dir):
os.makedirs(cls.temp_dir)
@classmethod
def tearDownClass(cls):
# Удаляем временную директорию после всех тестов в классе
import shutil
shutil.rmtree(cls.temp_dir)
def setUp(self):
# Создаем временный файл для каждого теста
self.temp_file = os.path.join(self.temp_dir, "temp_file.txt")
with open(self.temp_file, "w") as f:
f.write("This is a test file.")
def tearDown(self):
# Удаляем временный файл после каждого теста
os.remove(self.temp_file)
def test_file_exists(self):
self.assertTrue(os.path.exists(self.temp_file))
def test_file_content(self):
with open(self.temp_file, "r") as f:
content = f.read()
self.assertEqual(content, "This is a test file.")
if __name__ == '__main__':
unittest.main()
В этом примере:
Фикстуры `setUpClass` и `tearDownClass` выполняются только один раз для всех тестов в классе, в то время как `setUp` и `tearDown` выполняются перед и после каждого отдельного теста.
Использование фикстур делает тесты более читаемыми, поддерживаемыми и обеспечивает их изоляцию, предотвращая влияние одного теста на другой.