Тестирование в Python [unittest]. Часть 3. TestSuite. Загрузка и запуск тестов

Тестирование в Python [unittest]. Часть 3. TestSuite. Загрузка и запуск тестов

Третья часть из цикла статей про unittest в Python посвящена TestSuite – второй важной составляющей framework’а для тестирования, а также загрузке и запуску тестов (классы TestLoader, TestResult, TextTestRunner).

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

Класс TestSuite

Класс TestSuite используется для объединения тестов в группы, которые могут включать в себя как отдельные тесты так и заранее созданные группы. Помимо этого, TestSuite предоставляет интерфейс, позволяющий TestRunner’у, запускать тесты. Разберем более подробно методы класса TestSuite.

addTest(test)

Добавляет TestCase или TestSuite в группу.

addTests(tests)

Добавляет все TestCase и TestSuite объекты в группу, итеративно проходя по элементам переменной tests.

run(result)

Запускает тесты из данной группы.

countTestCases()

Возвращает количество тестов в данной группе (включает в себя как отдельные тесты, так и подгруппы).

Рассмотрим пример использования TestSuite.

В качестве кода, который нужно протестировать, возьмем уже знакомый нам модуль calc.py.

За основу модуля с тестами примем тот, что приведен в конце первой статьи. Назовем его calc_tests.py.

Для запуска тестов дополнительно создадим модуль test_runner.py и добавим в него следующий код.

Все модули должны находиться в одном каталоге. Для запуска тестов используйте команду:

В примере мы использовали класс TextTestRunner, о нем будет рассказано чуть позже.

Расширим функционал модуля calc, для этого добавим в него пару методов: первый будет вычислять квадратный корень, второй – возводить число в определенную степень.

Добавим тесты для новых функций, создав новый класс с именем CalcExTests (расширенные функции калькулятора) с тестами для sqrt() и pow(), а класс CalcTest переименуем в CalcBasicTests (базовые функции калькулятора).

Запустив test_runner.py получим следующий результат.

Как видно из примера: было запущено шесть тестов, четыре из класса CalcBasicTests и два из CalcExTests, все тесты завершились удачно. Количество тестов в группе указано в самой первой строке вывода: count of tests: 6.

Загрузка и запуск тестов

Рассмотрим более подробно вопросы загрузки и запуска тестов.

Класс TestLoader

Начнем с класса TestLoader. Этот класс используется для создания групп из классов и модулей. Среди методов TestLoader можно выделить: loadTestsFromTestCase(testCaseClass) , возвращающий группу со всеми тестами из класса testCaseClass. Напоминаем, что под тестом понимается модуль, начинающийся со слова “test”. Используя этот метод, можно создать список групп тестов, где каждая группа создается на базе классов-наследников от TestCase, объединенных предварительно в список. Для демонстрации данного подхода модифицируем test_runner .py (написано по материалам dr.dobb’s).

Модуль test_runner .py

Рассмотрим ещё несколько методов из TestLoader.

loadTestsFromModule(module, pattern=None)

Загружает все тесты из модуля module. Если модуль поддерживает load_tests протокол, то будет вызвана соответствующая функция модуля и ей будет передан в качестве аргумента (третьим по счету) параметр pattern.

loadTestsFromName(name, module=None)

Загружает тесты в соответствии с параметром name. Параметр name – это имя, разделенное точками. С помощью этого имени указывается уровень, начиная с которого будут добавляться тесты.

getTestCaseNames(testCaseClass)

Возвращает список имен методов-тестов из класса testCaseClass.

Приведем примеры того, как можно использовать данные методы. Для демонстрации loadTestsFromModule изменим модуль test_runner.py.

Запустим модуль test_runner.py.

Результатом выполнения будет подробный отчет о прохождении шести тестов:

Если в модуле test_runner.py заменить строку

то будут выполнены только тесты из класса CalcBasicTests.

Класс TestResult

Класс TestResult используется для сбора информации о результатах прохождения тестов. Подробную информацию по атрибутам и классам этого метода можно найти в официальной документации.

Для демонстрации возможностей класса TestResult модифицируем модуль test_runner.py:

Запустив его, получим следующий результат:

Класс TextTestRunner

Объекты класса TextTestRunner используются для запуска тестов. Среди параметров, которые передаются конструктору класса, можно выделить verbosity, по умолчанию он равен 1, если создать объект с verbosity=2, то будем получать расширенную информацию о результатах прохождения тестов. Для запуска тестов используется метод run(), которому в качестве аргумента передается класс-наследник от TestCase или группа (TestSuite).

В наших примерах TextTestRunner используется в модуле test_runner.py в строчках:

В первой строке создается объект класса TextTestRunner с verbosity=2, а во второй строке запускаются тесты из группы suites, результат тестирования попадает в объект testResult, атрибуты которого можно анализировать в дальнейшем.

📎📎📎📎📎📎📎📎📎📎