Как создать и использовать фикстуры с помощью `unittest`?

В `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` фикстуры реализуются с помощью специальных методов, которые вызываются автоматически фреймворком:

  • `setUp()`: Вызывается перед каждым тестовым методом в тестовом классе. Используется для настройки тестовой среды для каждого отдельного теста (например, создание временных файлов, инициализация объектов).
  • `tearDown()`: Вызывается после каждого тестового метода в тестовом классе, независимо от того, был ли тест пройден, провален или вызвал исключение. Используется для очистки тестовой среды после каждого теста (например, удаление временных файлов, закрытие соединений с базой данных).
  • `setUpClass()`: Классовый метод (объявляется с `@classmethod`). Вызывается один раз перед выполнением всех тестов в тестовом классе. Подходит для настройки, которая требуется только один раз для всех тестов (например, создание подключения к базе данных).
  • `tearDownClass()`: Классовый метод (объявляется с `@classmethod`). Вызывается один раз после выполнения всех тестов в тестовом классе. Используется для очистки после всех тестов в тестовом классе (например, закрытие подключения к базе данных).
  • `setUpModule()`: Функция, которая вызывается один раз перед выполнением всех тестов в модуле. Используется для настройки, которая требуется один раз для всех тестов в модуле.
  • `tearDownModule()`: Функция, которая вызывается один раз после выполнения всех тестов в модуле. Используется для очистки после всех тестов в модуле.

Пример:

    
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()` удаляет временный файл после каждого теста.

Фикстуры `setUpClass` и `tearDownClass` выполняются только один раз для всех тестов в классе, в то время как `setUp` и `tearDown` выполняются перед и после каждого отдельного теста.

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

0