Как проверять поведение калькулятора при пустых полях и валидных значениях
Что проверяют
Умеете ли вы строить тест-дизайн на классах эквивалентности и граничных значениях и оформлять его в pytest, а не набором print. Следом обычно спрашивают, что считать пустым полем и как калькулятор должен сообщать об ошибке.
Как отвечать
Сначала договоритесь о контракте: на пустом вводе функция бросает исключение, возвращает ошибку валидации или интерфейс блокирует кнопку. От этого зависит, что проверять. Потом разбейте ввод на классы:
- пустые:
"", строка из пробелов,None, если значение приходит из API; одно поле пустое, оба пустых. Все дают одну понятную ошибку, а не падение; - валидные: целое, дробное, отрицательное, ноль, очень большое число. Отдельно десятичная запятая: пользователь в России наберёт
3,5, аfloat("3,5")броситValueError; - невалидные: буквы, два разделителя,
1e5(решите, считать ли его числом); - операции: деление на ноль, дробный результат.
Параметризуйте, чтобы каждый случай был отдельным тестом с понятным именем: @pytest.mark.parametrize("a, b, expected", [...], ids=[...]). Ошибки проверяйте через with pytest.raises(ValidationError, match="пуст"). Дробные результаты сравнивайте через pytest.approx, потому что 0.1 + 0.2 == 0.3 в Python ложно; для денег правильнее Decimal в самом калькуляторе.
Если у калькулятора есть интерфейс, те же классы проверяются в UI: сообщение у поля, заблокированная кнопка, фокус на пустом поле. Логику выгоднее покрыть юнит-тестами, а в UI оставить несколько сквозных сценариев.
Где спотыкаются
Возвращают строку ошибки вместо исключения. Функция начинает отдавать то число, то текст, и вызывающий код пытается сложить 8.0 с «Ошибка: поле пустое».
Забывают, что float() щедрее, чем кажется: он принимает " 5 " с пробелами, а также "nan" и "inf". Без явной проверки калькулятор покажет nan вместо ошибки.
Проверяют только «удобные» пары чисел и не трогают пробелы и запятую. В реальном вводе именно они дают большинство жалоб.