Как обработать ошибки при передаче нечисловых значений в метод
Что проверяют
Для QA это вопрос о двух вещах: как вы проверяете поведение метода на некорректном вводе и как пишете код автотестов, чтобы он не глотал ошибки. Следом часто просят составить набор негативных значений или написать тест, который действительно упадёт, если исключения не было.
Как отвечать
Сначала зафиксируйте контракт: что метод должен сделать со строкой «abc». Бросить исключение, вернуть ошибку валидации или код 400 либо 422, если это API. Без явного ожидаемого результата негативный тест писать не на что.
Дальше набор входных данных по классам эквивалентности:
- явно не число:
"abc", пустая строка, строка из пробелов,Noneилиnull; - похоже на число:
"12abc","1,5"против"1.5"," 42 "с пробелами,"1e3"; - особые значения:
"NaN","Infinity", очень большие и отрицательные числа, ноль; - ловушки типов: в Python
boolнаследуетint, поэтомуisinstance(True, int)вернётTrue, и такая проверка пропустит булево значение.
Проверка в тесте должна падать, если исключения не было. В pytest это with pytest.raises(TypeError, match="..."):, в JUnit 5 assertThrows(NumberFormatException.class, () -> ...). Набор значений прогоняют через @pytest.mark.parametrize или @ParameterizedTest с @ValueSource, а не копированием теста.
Если речь о вашем вспомогательном коде, например разборе тестовых данных из CSV, правило то же: невалидное значение даёт понятную ошибку с указанием, что и где пришло, а не тихую подстановку нуля. Текст ошибки тоже проверяйте: по нему должно быть ясно, какое поле и почему не прошло.
Где спотыкаются
Пишут тест через try/except с pass внутри. Если метод исключение не бросил, тест всё равно зелёный. Это самый частый дефект в негативных автотестах.
Путают тип исключения. В Python для значения не того типа принято TypeError, а ValueError бросают, когда тип правильный, но значение нет, как у int("abc"). Тест, который ловит любое Exception, пропустит совсем другую ошибку.
Проверяют только "abc" и считают тему закрытой. Реальные дефекты чаще прячутся в "1,5", пробелах и пустой строке.