04.18 Тестирование
- Что могут и чего не могут тесты
Использование unittest
Просто файл test_что-то-там.py и класс, унаследованный от unittest.TestCase, с методами вида test_что-то-там() и self.assertЧто-то() внутри (assert тоже можно, но так правильнее)
- Проверка исключений: контекст-менеджер
Пример: тестирование примитивной функции
Задача_1: написать и оттестировать функцию, решающую квадратное уравнение с ненулевым коэффициентом при старшем члене
функция solveSquare() получает на вход коэффициенты квадратного уравнения: a, b, c. Гарантируется, что a != 0.
- функция должна возвращать корни уравнения a*x^2 + b*x + c = 0
при положительном дискриминанте (D = b^2 - 4*a*c > 0): возвращать кортеж из двух корней, меньший - первый
- при D = 0: возвращать кортеж из двух одинаковых корней
при D < 0: расчет корней не реализован, возвращать None
- тесты для solveSquare() должны быть написаны при помощи unittest, и включать:
тест для случая D > 0
- тест для случая D = 0
тест для случая D < 0
- Контрольная проверка: все тесты проходят
- Контрольная проверка:
сломать код solveSquare(), заменив сравнение дискриминанта с 0 на сравнение дискриминанта с 1
- проверить, перестали ли проходить какие-то из тестов
- если по-прежнему проходят все тесты, добавить тест, который НЕ проходит (а на несломанном коде - проходит)
- пушить сломанный код не надо!
Квазиобъекты (мокеры) unittest.mock]
- Зачем нужны и пример в документации
Пример простого мокера-метода с отчётом
Пример мокера-метода, возвращающего заданное значение
- Фикстуры. setUp() и tearDown()
пример с подготовкой и открытием файла в качестве фикстуры, а также удалением его в конце
Д/З
- Доделать Задачу_1, если ещё не
Задача_2. Тестирование решателя квадратных уравнений при помощи мокеров
Написать программу для решения уравнений вида $$ax^2+bx+c$$ (с любыми коэффициентами), которая:
- получает со стандартного ввода коэффициенты квадратного уравнения, выдавая последовательно запросы на ввод, с приглашениями "Input a:", "Input b:", "Input c:"
собственно решает уравнение при помощи solveSquare() (см. Задачу_1)
выводит результат в виде "Solution: <результат>"
В программе весь ввод-вывод должен осуществляться через класс SquareIO с методами:
inputCoeff(name), выводящий приглашение "Input <name>:", считывающий ввод и возвращающий то что введено
printResult(result), выводящий результат в указанном выше формате
Важно: всё взаимодействие со стандартным вводом/выводом должно быть локализовано в классе SquareIO
- В тестах
Изготовить качественный Mock для имитации SquareIO
- Оттестировать все различные комбинации параметров (для квадратного уравнения, для линейного и для вырожденного)
- Оттестировать неправильный ввод
- замерить тестовое покрытие
(необязательно) настроить замер так, чтобы он показывал 100%