Какие проверки логики и валидации нужны для калькулятора с двумя полями ввода и подсчетом суммы
Что проверяют
Видите ли вы в простой задаче реальные ловушки ввода и арифметики, а не только «проверить, что это число». Следом часто просят написать функцию и набор тестов к ней.
Как отвечать
Разделите три слоя: разбор строки, бизнес-правила, само сложение. Сложение делайте чистой функцией, её легко покрыть pytest.mark.parametrize.
Что проверять на входе:
- пустое поле:
""и строка из пробелов, перед разборомstrip(); - формат числа:
float()принимает"1e3"," 5 ","1_000", а также"nan"и"inf". Последние два почти всегда нужно отсечь черезmath.isfinite; - десятичный разделитель:
"2,5"даётValueError. Решите заранее, принимаете ли вы запятую; - точность:
0.1 + 0.2даёт0.30000000000000004. Для денег беритеDecimal, создавая его из строки, а не изfloat, и округляйте черезquantize; - переполнение:
intв Python не переполняется, аfloatпри сумме1e308 + 1e308молча даётinf. Реальное ограничение обычно дальше: колонка в базе или фронтенд, где целые точны только до 2 в 53-й степени; - диапазон: минимум, максимум и допустимость отрицательных задают требования. Сумма отрицательных чисел законна, запрещать её без причины не нужно;
- интерфейс: ошибка показана у конкретного поля, кнопка неактивна при невалидном вводе, а сервер всё равно валидирует заново. В API удобна модель Pydantic, где
nanиinfотключаются черезallow_inf_nan=False.
Набор тестовых данных: пусто, пробелы, abc, 5, -3, 2.5, 2,5, 1e3, inf, nan, очень длинная строка, пара 0.1 и 0.2.
Где спотыкаются
Проверяют ввод через isdigit(). Он отвергает -5 и 2.5, зато пропускает "²", на котором int() потом падает.
Считают деньги во float и сравнивают результат через ==.
Ловят всё голым except с одним сообщением «ошибка ввода» или придумывают ограничения вроде «только положительные», не уточнив условие.