Autotesting Flashcards
По степени изолированности тестируемых частей кода функциональные тесты принято делить на три типа:
Модульные — простые, но не очень эффективные тесты. Они проверяют работоспособность функций или других конкретных модулей программы
Интеграционные — такие тесты охватывают большую часть системы и проверяют, работают ли модули вместе. Таким тестам программисты уделяют основное внимание. Интеграционные тесты все еще достаточно просто писать, если экосистема проекта подготовлена к этому
Системные — самые эффективные тесты, но при этом их сложно писать и поддерживать. Они эмулируют поведение пользователя: кликают на ссылки, отправляют формы. Такие тесты часто ломаются, потому что они опираются на верстку сайта, а она может непредсказуемо поменяться. Еще при таком тестировании невозможно точно определить, когда с точки зрения программы закончилось одно действие и началось другое
Хорошие тесты
Хорошие тесты ничего не знают о внутреннем устройстве проверяемого кода. Это делает их более универсальными и надежными.
пограничные случаи — ситуации, в которых код может вести себя по-особенному:
- Работа с пустой строкой
- Обработка None
- Деление на ноль (в большинстве языков вызывает ошибку)
- Специфические ситуации для конкретных алгоритмов
цикломатической сложностью
Комбинация всех возможных вариантов поведения функции называется цикломатической сложностью. Это число, которое показывает все возможные пути кода внутри функции.
нужно ли внутри capitalize() обрабатывать число вместо строки?
Не стоит этого делать. Все равно должны быть тесты, которые проверяют, что система работает в целом, а они обычно выявляют проблемы кода на более нижних уровнях.
Ответственность за передачу правильных данных в функцию capitalize() лежит не на самой функции, а на коде, который вызывает эту функцию.
Сколько нужно тестов?
Но даже если ошибка обрабатывается внутри функции, не надо пытаться написать тесты, покрывающие каждую ошибку. Это выливается в огромное число тестов, которые требуют поддержки и времени на написание. Нужно уметь вовремя остановиться и двигаться дальше, к покрытию другого кода.
Можно ли сказать, что протестированный код точно не содержит ошибок?
Нет, тесты проверяют код только с определенными параметрами, другие входные параметры могут привести к ошибкам
Выберите идеальный способ работы с тестами при возникновении багов в коде
Пишем тест, в котором баг воспроизводится, потом правим код и проводим тест еще раз
Что важно для тестов в большинстве ситуаций?
Выполняет ли код свою задачу
Как правильно проверить функцию is_none()?
assert is_none(None)
Какое утверждение подойдет, если нужно проверить, что 3 — это простое число?
assert is_prime(3)
Какое утверждение лучше подходит для ситуации, когда надо проверить длину строки?
assert len(‘str’) == 3
Печать при запуске Pytest
Если понадобится распечатать что-то на экран, то Pytest ничего не выведет. По умолчанию он перехватывает и подавляет весь вывод. Отключить это поведение можно с помощью флага -s:
poetry run pytest -s
Структура теста
def test_reverse(): assert reverse('Hexlet') == 'telxeH'
В какой директории должны лежать тесты Pytest?
tests
Как правильно запускать Pytest на выполнение?
poetry run pytest
pytest
Какой флаг отключает подавление вывода на экран при вызове pytest?
-s
Что такое модульное тестирование?
Это тестирование направлено на проверку модулей программы в изоляции от всех остальных частей. Эти тесты обычно тестируют базовые конструкции языка: функции, модули, классы. Такие тесты не дают никаких гарантий работы всего приложения в целом, но хорошо помогают тогда, когда какой-то модуль программы имеет сложную логику.
Что проверяет первый тест?
Первый тест всегда должен проверять позитивный сценарий — тот, в котором задействована основная функциональность тестируемого компонента