Задать вопрос
@vcutler02

Как написать юнит тест для программы, которая использует input()?

только начал кодить!!!
Есть код, который принимает номер машины и показывает данные о ней. Нужно сделать тест который бы указывал на то что указана не правильная область( два первых символа в строке из 8 символов). Например: Есть номер АА1234АА, он подходит, но уже CH1234АА не подходит. Как для этого сделать юнит тест? Заранее спасибо620c2b128851c714289591.png
  • Вопрос задан
  • 358 просмотров
Подписаться 1 Простой 2 комментария
Решения вопроса 1
@Akela_wolf
Extreme Programmer
Юнит-тестирование это про разделение функций на минимально возможные кусочки, чтобы их было возможно протестировать минимально возможным тестом. А для этого каждая функция должна делать что-то одно. У вас же функция занимается следующими вещами:
  1. Ведет диалог с пользователем
  2. Проверяет корректность введенных данных по своим правилам
  3. Обращается к внешнему сервису (причем какой-то апи-ключ прямо в коде - ужас-ужас. А если этот код выкладывать в гитхаб?)
  4. Выводит полученный от внешнего сервиса результат на экран

Разделим это на 4 функции и увидим следующее:
  1. Функция ввода номера пользователем. Входных параметров нет, выходные - номер. Тестировать не имеет особого смысла.
  2. Функция валидации. Входной параметр - номер, выходной - один из кодов (enum): все хорошо, некорректный регион, некорректный номер. Функция чистая (то есть результат её работы зависит только от аргумента, побочных эффектов нет), тестами накрывается легко и просто.
  3. Функция запроса данных у стороннего сервиса. Входной параметр - номер, выходной - какие-то данные. Тестировать сложно т.к. есть внешний сервис. И может быть не особо нужно, т.к. юнит-тест тут не напишешь. Функция как-то сложной логики не имеет, а внешний сервис нам неподконтролен. В частности, он в любой момент может начать отвечать 404 или каким-нибудь бредом. Поэтому тестировать эту функцию мы можем только имитируя поведение внешнего сервиса каким-то нашим моком (использовать тот же WireMock, например)
  4. Функция вывода результата на экран. Входной параметр - данные, выходных нет. Аналогично функции ввода номера тестировать отдельно не имеет смысла.

Таким образом, вся бизнес-логика программы сосредоточена в функции валидации и внешнем сервисе. Внешний сервис, как я уже сказал, нам неподконтролен. Функцию валидации мы можем накрыть юнит-тестом. Остальное - если хочется, то можно накрыть end-to-end тестом, либо не покрывать вообще.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Andy_U
Читай про mock'и. Это про подмену функций, вызываемых из тестируемого кода.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
от 200 000 до 300 000 ₽
Greenway Global Новосибирск
от 150 000 ₽
Akronix Санкт-Петербург
от 150 000 до 200 000 ₽