Практика: модульное тестирование
На прошлых занятиях мы тестировали программы «руками»: вводили числа, нажимали кнопки, смотрели на результат. Но это медленно и утомительно. Настоящие разработчики пишут автоматические тесты — программы, которые проверяют другие программы.
Сегодня мы научимся писать модульные тесты (unit-тесты) на Python и C++.
Цель и задачи
Цель: получить практические навыки написания модульных тестов.
Что мы сделаем
- 1 Напишем простую функцию (калькулятор).
- 2 Напишем тесты для Python (pytest).
- 3 Напишем тесты для C++ (assert).
- 4 Запустим тесты и увидим результат.
- 5 Специально сломаем код и посмотрим, как тесты это обнаружат.
Что такое модульный тест
Модульный тест (unit test) — это программа, которая проверяет работу отдельной функции или метода.
Наша функция: калькулятор
Начнём с простой функции, которую будем тестировать. Она умеет складывать, вычитать, умножать и делить.
Python
C++
Установка pytest (Python)
Для Python мы будем использовать библиотеку pytest — популярный фреймворк для тестирования.
Установка
pytest --version.Что такое фреймворк
Фреймворк (framework) — это набор готовых инструментов и правил, которые упрощают разработку. pytest берёт на себя поиск тестов, их запуск и вывод результатов.
Структура проекта на Python
Создадим два файла: один с функциями, другой — с тестами.
test_, и запускает все функции, имя которых тоже начинается с test_.Пишем первый тест на Python
Вот как выглядит простейший тест для функции add.
assert — это ключевое слово Python. Оно проверяет, что условие истинно. Если условие ложно — тест падает с ошибкой.
pytest. Если всё хорошо — увидите зелёные точки. Если нет — красные и сообщение об ошибке.Тестируем исключения на Python
Функция div выбрасывает исключение при делении на ноль. Как это проверить?
Полный набор тестов на Python
Соберём все тесты для нашего калькулятора.
pytest. Если все тесты пройдены — вы увидите 4 зелёные точки. Это значит, что ваш код работает правильно.Тестирование на C++
В C++ нет встроенного фреймворка для тестирования, но есть assert — макрос, который проверяет условие.
assert в C++ — это макрос. Если условие ложно — программа аварийно завершается с сообщением. Если истинно — продолжает работу.
assert работает только в отладочной сборке. В релизной сборке он может быть отключён. Для серьёзных проектов используют специальные фреймворки (Catch2, Google Test).Полный набор тестов на C++
Соберём тесты для всех операций.
g++ -std=c++17 test.cpp calc.cpp -o test. Запуск: ./test. Если увидите «Все тесты пройдены!» — отлично.Специально ломаем код
Чтобы убедиться, что тесты работают, давайте специально сломаем функцию add.
Что произойдёт?
При запуске pytest вы увидите красную ошибку:
Самостоятельные задания
Попробуйте написать тесты самостоятельно.
Задание 1
Напишите тест для функции sub, который проверяет вычитание нуля: 5 - 0 = 5.
Задание 2
Напишите тест для функции mul, который проверяет умножение на отрицательное число: 3 * (-4) = -12.
Задание 3
Напишите тест для функции div, который проверяет деление на ноль (ожидается исключение).
Задание 4
Специально сломайте любую функцию и убедитесь, что тест обнаружил ошибку.
Шаблон для отчёта
Оформите результаты работы в виде отчёта.
Критерии оценки
Как будет оцениваться практическая работа.
Оценка «4» (хорошо): 14–17 баллов.
Оценка «3» (удовлетворительно): 10–13 баллов.
Советы по написанию тестов
Несколько практических советов, которые помогут писать хорошие тесты.
- Один тест — одна проверка. Не смешивайте несколько проверок в одной функции.
- Имя теста должно говорить о том, что он проверяет. Например,
test_add_positive_numbers. - Проверяйте граничные значения. Ноль, максимум, минимум.
- Проверяйте исключения. Если функция может выбросить ошибку — проверьте это.
- Запускайте тесты после каждого изменения. Это поможет сразу заметить проблему.
Итоги практики
Подведём итоги. Вот что вы освоили.
- ✅ Модульный тест — это программа, которая проверяет функцию.
- ✅ pytest — фреймворк для тестирования на Python.
- ✅ assert — ключевое слово (Python) или макрос (C++), который проверяет условие.
- ✅ pytest.raises — способ проверить, что функция выбрасывает исключение.
- ✅ Сломанный код обнаруживается тестами — это доказывает их пользу.
- ✅ Автотесты — это быстрый и надёжный способ проверки кода.
Домашнее задание
Задания для самостоятельной работы. Первые два обязательны, остальные — для оценки «отлично».
- Допишите тесты для всех операций калькулятора (сложение, вычитание, умножение, деление).
- Оформите отчёт по шаблону.
- Напишите тест для функции «остаток от деления» (добавьте её в калькулятор).
- Попробуйте использовать фреймворк
unittest(встроенный в Python) вместо pytest. - Для C++: попробуйте подключить фреймворк Catch2 и написать тесты с его помощью.
Что дальше?
В этом блоке по тестированию у нас ещё несколько материалов.
- Лекция 4: покрытие кода и метрики (MC/DC).
- Практика 3: интеграционное тестирование.
- Лекция 5: отладка и инструменты разработчика.
Спасибо за работу!
🧪
Тесты — это ваша страховка от ошибок
Чем раньше вы начнёте писать тесты, тем увереннее будете себя чувствовать при изменении кода. Это привычка, которая окупается сторицей.