
Модуль unittest встроен в стандартную библиотеку Python и предназначен для автоматической проверки корректности кода. Его преимущество в том, что он не требует установки сторонних пакетов: достаточно использовать стандартный интерпретатор.
Для запуска тестов необходимо создать отдельный файл с тестовыми функциями или классами. В основе лежит класс unittest.TestCase, где каждая функция, начинающаяся с префикса test_, рассматривается как отдельный тест. Например, метод assertEqual() проверяет равенство значений, а assertRaises() отлавливает исключения.
Старт выполнения тестов осуществляется через команду python -m unittest, после чего интерпретатор автоматически находит и выполняет все тесты в указанных модулях или директориях. Также можно запустить конкретный метод, указав полный путь в формате имя_модуля.КлассТеста.метод.
Такой подход позволяет изолированно проверять каждую функцию или компонент программы, минимизируя вероятность скрытых ошибок при изменениях в кодовой базе. В следующих шагах будут показаны примеры создания тестов, запуска отдельных методов и организации структуры проекта с использованием unittest.
Создание тестируемого модуля и структуры проекта

Для удобного запуска unittest необходимо заранее подготовить проектную структуру. На практике используется раздельное хранение исходного кода и тестов.
| Каталог/файл | Назначение |
|---|---|
project/ |
Корневой каталог проекта |
project/app/ |
Основной код приложения |
project/app/__init__.py |
Маркирует каталог как пакет Python |
project/app/calculator.py |
Пример модуля, функции которого будут тестироваться |
project/tests/ |
Каталог с тестами |
project/tests/__init__.py |
Обеспечивает корректный импорт тестов как пакета |
project/tests/test_calculator.py |
Файл с тестами для calculator.py |
В качестве примера создадим модуль calculator.py со следующими функциями:
def add(a, b):
return a + b
def divide(a, b):
if b == 0:
raise ValueError("Деление на ноль невозможно")
return a / b
Такой минимальный набор позволяет проверить как корректные вычисления, так и обработку исключений. После этого можно писать тесты в test_calculator.py, сохраняя единообразие структуры.
Написание первого теста с использованием unittest.TestCase

Для создания теста необходимо определить класс, унаследованный от unittest.TestCase. Внутри класса описываются методы, имена которых должны начинаться с test_. Это требование позволяет фреймворку автоматически находить и запускать тесты.
Пример файла test_math_utils.py:
import unittest
def multiply(a, b):
return a * b
class TestMathUtils(unittest.TestCase):
def test_multiply_positive_numbers(self):
self.assertEqual(multiply(3, 4), 12)
def test_multiply_by_zero(self):
self.assertEqual(multiply(5, 0), 0)
if __name__ == "__main__":
unittest.main()
Методы проверки (например, assertEqual) сравнивают ожидаемое и фактическое значения. В случае несоответствия тест завершается с ошибкой. Для разных сценариев предусмотрены дополнительные методы: assertTrue, assertFalse, assertRaises и другие.
Запуск выполняется командой python test_math_utils.py. Результат тестов отображается в консоли: точка означает успешное выполнение, буква F – проваленный тест, E – ошибка выполнения.
Запуск теста через команду python -m unittest

Для запуска тестов достаточно выполнить команду python -m unittest. Если в проекте есть файл test_example.py с классами, унаследованными от unittest.TestCase, то при вызове команды без аргументов будут найдены и запущены все тестовые методы, начинающиеся с test_.
Чтобы запустить тесты из конкретного файла, укажите его имя: python -m unittest test_example.py. Для отдельного класса используйте точечную нотацию: python -m unittest test_example.TestMath. Для отдельного метода в классе: python -m unittest test_example.TestMath.test_add.
Если структура проекта содержит каталог tests с несколькими файлами, удобно использовать команду python -m unittest discover -s tests. Опция -s задаёт стартовую директорию поиска тестов, а при необходимости можно добавить -p для указания шаблона имён файлов, например -p "test_*.py".
Использование discover для автоматического поиска тестов
В модуле unittest функция discover позволяет автоматически находить и запускать все тестовые файлы в заданной директории. Стандартный вызов выглядит так: unittest.defaultTestLoader.discover(start_dir, pattern='test*.py'). Параметр start_dir указывает корневую папку для поиска, pattern – шаблон имени файлов. Например, pattern='test_*.py' подхватит все файлы, начинающиеся с test_.
Рекомендуется держать тесты в отдельной директории, например tests/, чтобы discover не сканировал лишние модули проекта. Запуск из командной строки возможен через: python -m unittest discover -s tests -p "test_*.py". Флаг -s задаёт стартовую директорию, -p – шаблон файлов.
Для проектов с глубокой структурой можно использовать параметр top_level_dir, указывающий корень проекта. Это особенно важно, если тесты находятся в подпакетах: unittest.defaultTestLoader.discover('tests', pattern='test_*.py', top_level_dir='my_project'). Такой подход гарантирует корректное разрешение импортов.
При использовании discover unittest создаёт объект TestSuite, включающий все найденные тесты. Его можно передать в TextTestRunner для запуска и получения отчёта. Пример: runner = unittest.TextTestRunner(); runner.run(tests). Это позволяет интегрировать автоматический поиск в скрипты CI/CD без ручного перечисления тестов.
Если требуется фильтрация по имени класса или метода, discover совместно с TestLoader.loadTestsFromName позволяет запускать только конкретные наборы тестов, сохраняя автоматическую организацию файлов.
Организация тестов в отдельный каталог tests

Разделение тестов в отдельный каталог повышает читаемость и удобство поддержки проекта. Стандартная практика – создавать папку tests в корне проекта, параллельно с основным пакетом.
Пример структуры проекта:
project/my_package/– основной кодtests/– каталог с тестамиtest_module1.pytest_module2.py
setup.py
Для корректного обнаружения модулей добавьте файл __init__.py в каталог tests, если используете относительные импорты.
Рекомендации по организации:
- Каждому модулю исходного кода соответствует отдельный тестовый файл, именуемый по шаблону
test_имя_модуля.py. - Классы тестов именовать по схеме
TestИмяКласса, чтобы unittest автоматически их обнаруживал. - Внутри классов использовать методы, начинающиеся с
test_для автоматического запуска. - Разделяйте тесты на логические блоки с помощью отдельных методов, избегая длинных функций с множеством проверок.
Запуск всех тестов из каталога tests:
python -m unittest discover -s tests -p "test_*.py"
Здесь -s tests указывает каталог поиска, а -p "test_*.py" – шаблон имен файлов для тестирования.
Использование отдельного каталога упрощает интеграцию с CI/CD, позволяет запускать тесты пакетами и снижает риск случайного выполнения вспомогательных скриптов.
Запуск отдельных методов и классов тестов

В Python модуль unittest позволяет запускать конкретные тестовые классы или методы без выполнения всего набора тестов. Для этого используется конструкция unittest.TestLoader().loadTestsFromTestCase() или unittest.TestLoader().loadTestsFromName().
Чтобы запустить отдельный класс тестов, создайте объект TestSuite и передайте в него загруженный класс:
from unittest import TestLoader, TextTestRunner, TestSuite
from my_tests import MyTestClass
suite = TestSuite()
suite.addTests(TestLoader().loadTestsFromTestCase(MyTestClass))
TextTestRunner().run(suite)
Для запуска конкретного метода класса укажите его имя в формате 'ИмяКласса.имя_метода':
suite = TestLoader().loadTestsFromName('MyTestClass.test_method_one', module='my_tests')
TextTestRunner().run(suite)
Дополнительно можно использовать командную строку для точечного запуска без изменений кода:
python -m unittest my_tests.MyTestClass.test_method_one
При таком подходе unittest выполняет только выбранный метод, игнорируя остальные. Для запуска нескольких методов одного класса их перечисляют через пробел или создают отдельный TestSuite с несколькими addTests.
Использование loadTestsFromName полезно при сложных структурах пакетов, так как позволяет указать полное имя модуля и метода: package.subpackage.module.MyTestClass.test_method.
Вопрос-ответ:
Что такое модуль unittest и для чего он нужен в Python?
unittest — это встроенный модуль Python для создания и запуска тестов. С его помощью можно проверять работу отдельных функций или классов, выявлять ошибки на ранних этапах разработки и обеспечивать стабильность кода. Он позволяет писать тесты в виде классов, наследующих unittest.TestCase, и автоматически собирать их для выполнения. Это облегчает контроль за корректностью работы программы при внесении изменений.
Как правильно написать простой тест с использованием unittest?
Для создания базового теста нужно импортировать unittest и определить класс, наследующий unittest.TestCase. В этом классе создаются методы, начинающиеся с «test_», где выполняются проверки с помощью assert-методов, например assertEqual или assertTrue. После этого тесты можно запускать через командную строку или с помощью unittest.main(). Такой подход позволяет проверить отдельные функции на корректность работы с разными входными данными.
Какие способы запуска тестов через unittest существуют?
Тесты можно запускать несколькими способами: через командную строку командой python -m unittest имя_файла.py, через вызов unittest.main() в конце тестового файла, или с использованием TestLoader и TestSuite для объединения нескольких тестов. Также существует возможность запускать только определённые тестовые классы или методы, указывая их после имени файла через точку. Каждый способ полезен в разных ситуациях, например для проверки отдельных компонентов или всей программы целиком.
Можно ли проверять исключения и ошибки с помощью unittest?
Да, unittest предоставляет специальные методы для проверки выброса исключений, такие как assertRaises. Их можно использовать в контексте with или как декоратор для тестовых методов. Это позволяет убедиться, что функция корректно реагирует на некорректные данные или особые условия. Такой подход помогает избежать неожиданных сбоев при работе программы и делает тесты более надёжными.
Как увидеть подробный результат выполнения тестов?
Для вывода детальной информации при запуске тестов можно использовать ключ -v в командной строке: python -m unittest -v имя_файла.py. В таком режиме отображается информация о каждом тестовом методе, результат его выполнения и возникающие ошибки или неудачные проверки. Подробный вывод помогает быстро найти проблемные участки кода и понять, какие проверки прошли успешно, а какие — нет.
