Какие граничные значения и негативные кейсы тестировать для функции проверки треугольника
Что проверяют
Умеете ли вы превратить знакомую задачу в систему тестов, а не в пять случайных примеров. Следом просят написать эти тесты на pytest и спрашивают, что делать с дробными сторонами.
Как отвечать
Сначала уточните контракт: какие типы принимает функция, что возвращает на невалидный ввод (False или исключение), считается ли вырожденный треугольник треугольником. От этого зависят ожидаемые результаты. Дальше идите по классам:
- граница неравенства треугольника:
(1, 2, 3)это точка перелома, рядом с ней(2, 2, 3)валиден,(1, 2, 4)нет. Обычно неравенство строгое, и вырожденный случай даётFalse; - все перестановки: нарушающая сторона должна стоять на каждом из трёх мест, иначе пропустите реализацию, которая проверяет только
a + b > c; - ноль и отрицательные:
(0, 1, 1),(-1, 2, 2),(0, 0, 0); - дробные числа:
(0.1, 0.2, 0.3)математически вырожден, но0.1 + 0.2 > 0.3воfloatистинно, и функция скажет «треугольник». Нужен допуск черезmath.iscloseилиDecimal; - особые значения:
nanиinf. Сравнения<,>и==сnanложны, и проверка видаif a + b <= c: return Falseпропуститnanдальше; - типы: строка
"3",None, список,True. Последний коварен:boolв Python наследникint, и(True, True, True)пройдёт как равносторонний.
Оформляйте это одним @pytest.mark.parametrize с понятными ids, а исключения проверяйте через pytest.raises с конкретным типом. Хорошо звучит упоминание Hypothesis: генерация случайных сторон и проверка свойства, что ответ не зависит от порядка аргументов.
Где спотыкаются
Проверяют один порядок сторон. Ошибка в условии для второй или третьей стороны остаётся незамеченной.
Путают граничные значения с классами эквивалентности и пишут десяток валидных треугольников вместо одного на класс и точек у самой границы.
Забывают про float и bool. Именно на них падают «очевидно правильные» реализации, и именно этих случаев интервьюер ждёт как признака опыта.