Как запустить unittest в Python пошаговое руководство

Как запустить unittest python

Как запустить unittest python

Модуль 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

Для создания теста необходимо определить класс, унаследованный от 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

Для запуска тестов достаточно выполнить команду 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

Разделение тестов в отдельный каталог повышает читаемость и удобство поддержки проекта. Стандартная практика – создавать папку tests в корне проекта, параллельно с основным пакетом.

Пример структуры проекта:

  • project/
    • my_package/ – основной код
    • tests/ – каталог с тестами
      • test_module1.py
      • test_module2.py
    • setup.py

Для корректного обнаружения модулей добавьте файл __init__.py в каталог tests, если используете относительные импорты.

Рекомендации по организации:

  1. Каждому модулю исходного кода соответствует отдельный тестовый файл, именуемый по шаблону test_имя_модуля.py.
  2. Классы тестов именовать по схеме TestИмяКласса, чтобы unittest автоматически их обнаруживал.
  3. Внутри классов использовать методы, начинающиеся с test_ для автоматического запуска.
  4. Разделяйте тесты на логические блоки с помощью отдельных методов, избегая длинных функций с множеством проверок.

Запуск всех тестов из каталога 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. В таком режиме отображается информация о каждом тестовом методе, результат его выполнения и возникающие ошибки или неудачные проверки. Подробный вывод помогает быстро найти проблемные участки кода и понять, какие проверки прошли успешно, а какие — нет.

Ссылка на основную публикацию