В `unittest` (модуле для юнит-тестирования в Python) класс теста – это класс, который наследуется от `unittest.TestCase`. Этот класс содержит методы, которые представляют собой отдельные тестовые случаи, а также методы настройки и завершения, выполняемые до и после каждого теста или всего набора тестов.
Основные характеристики и роль класса теста:
- Наследование от `unittest.TestCase`: Ключевой момент - ваш класс теста должен наследовать от `unittest.TestCase`. Это предоставляет ему доступ ко всем методам, необходимым для определения тестов и проверки условий.
- Определение тестовых методов: Каждый метод, имя которого начинается с `test_`, считается отдельным тестовым случаем. `unittest` автоматически обнаруживает и выполняет эти методы при запуске тестов.
- Методы утверждений (assertions): Класс `unittest.TestCase` предоставляет множество методов `assert...` (например, `assertEqual`, `assertTrue`, `assertRaises` и т.д.) для проверки ожидаемых результатов. Тест считается пройденным, если все утверждения в его методе возвращают `True` (или не приводят к исключениям в случае `assertRaises`).
- Методы настройки (`setUp`) и завершения (`tearDown`):
- `setUp(self)`: Этот метод вызывается *перед* выполнением каждого тестового метода. Он используется для инициализации состояния, необходимого для теста (например, создание объектов, подключение к базе данных, открытие файлов).
- `tearDown(self)`: Этот метод вызывается *после* выполнения каждого тестового метода, независимо от того, был ли тест пройден или нет. Он используется для освобождения ресурсов, выделенных в `setUp` (например, закрытие файлов, удаление объектов, отключение от базы данных).
- Методы настройки на уровне класса (`setUpClass`) и завершения на уровне класса (`tearDownClass`):
- `setUpClass(cls)`: Этот метод вызывается *один раз* перед выполнением *всех* тестов в классе. Он часто используется для настройки ресурсов, используемых всеми тестами в классе. Это классовый метод (обратите внимание на аргумент `cls`).
- `tearDownClass(cls)`: Этот метод вызывается *один раз* после выполнения *всех* тестов в классе. Он используется для освобождения ресурсов, выделенных в `setUpClass`. Это также классовый метод.
Пример использования:
import unittest
class TestStringMethods(unittest.TestCase):
def setUp(self):
# Выполняется перед каждым тестовым методом
self.string = "hello world"
def tearDown(self):
# Выполняется после каждого тестового метода
del self.string
def test_upper(self):
self.assertEqual(self.string.upper(), 'HELLO WORLD')
def test_isupper(self):
self.assertFalse(self.string.isupper())
def test_split(self):
self.assertEqual(self.string.split(), ['hello', 'world'])
@classmethod
def setUpClass(cls):
# Выполняется один раз перед всеми тестами в классе
cls.shared_resource = "Common Resource"
@classmethod
def tearDownClass(cls):
# Выполняется один раз после всех тестов в классе
del cls.shared_resource
if __name__ == '__main__':
unittest.main()
Как это использовать:
- Импортируйте модуль `unittest`.
- Создайте класс, наследующийся от `unittest.TestCase`.
- Определите методы тестирования (начинающиеся с `test_`).
- Используйте методы `assert...` для проверки ожидаемых условий в каждом тесте.
- (Опционально) Определите методы `setUp` и `tearDown` для настройки и очистки перед/после каждого теста.
- (Опционально) Определите методы `setUpClass` и `tearDownClass` для настройки и очистки ресурсов на уровне класса.
- Запустите тесты с помощью `unittest.main()` (обычно в конце файла) или с помощью другого тестового запускателя.
Классы тестов в `unittest` обеспечивают структурированный и организованный способ написания и выполнения юнит-тестов, позволяя четко разделить тесты на логические группы и упростить поддержку и расширение набора тестов.