Введение

Проблема или ситуация, возникающая только при экстремальных рабочих параметрах.

Крайний случай – это проблема или ситуация, возникающая только при экстремальных (максимальных или минимальных) рабочих параметрах. Например, стереодинамик может заметно искажать звук при воспроизведении на максимальной громкости, даже при отсутствии других экстремальных настроек или условий. Крайний случай может быть предсказуемым или неожиданным. В инженерии планирование и корректная обработка крайних случаев может быть сложной задачей, которую часто упускают из виду или недооценивают. Некоторые распространенные причины возникновения крайних случаев:

Непредсказуемое поведение пользователей.
Эволюция сценариев использования (например, поведение пользователей может меняться со временем).
Недостаточное покрытие тестами.
Сложность продукта (например, в распределенных системах или микросервисной архитектуре).
Ограничения ресурсов (например, ограниченная вычислительная мощность, память компьютера или объем хранилища).
Другие внешние факторы.

Некоторые простые примеры крайних случаев:

Длинное имя пользователя в приложении вызывает переполнение и отображается некорректно.
Система бронирования некорректно обрабатывает резервации в високосный год (29 февраля).

Нетривиальные крайние случаи могут привести к отказу разрабатываемого объекта. Они могли быть не учтены на этапе проектирования и считаться невозможными при нормальной эксплуатации объекта. Поэтому попытки формализации хороших инженерных стандартов часто включают информацию о крайних случаях.

Инженеры программного обеспечения

В программировании крайний случай обычно связан с входными значениями, требующими специальной обработки в алгоритме компьютерной программы. В качестве способа проверки поведения компьютерных программ в таких случаях обычно создаются модульные тесты; они проверяют граничные условия алгоритма, функции или метода. Серия крайних случаев вокруг каждой "границы" может быть использована для обеспечения разумного покрытия и уверенности, исходя из предположения, что если программа корректно обрабатывает граничные значения, она должна корректно работать и в других случаях. Например, функция, делящая два числа, может быть протестирована с использованием как очень больших, так и очень маленьких чисел. Это основано на том, что если она работает для обоих пределов диапазона значений, она должна работать правильно и между ними. Программисты также могут создавать интеграционные тесты для обработки крайних случаев, не охваченных модульными тестами. Эти тесты охватывают случаи, которые проявляются только при тестировании системы в целом. Например, модульный тест может гарантировать, что функция правильно вычисляет результат, а интеграционный тест гарантирует, что эта функция работает правильно при интеграции с базой данных или внешним API. Эти тесты особенно важны с учетом растущей сложности систем в распределенных системах, микросервисах и устройствах Интернета вещей (IoT). В частности, тестирование микросервисов становится сложной задачей, поскольку интеграционные тесты могут не охватывать все конечные точки микросервисов, что приводит к необработанным крайним случаям. К другим типам тестирования, связанным с крайними случаями, относятся нагрузочное тестирование и негативное/отказоустойчивое тестирование. Оба метода направлены на расширение покрытия тестами системы, снижая вероятность возникновения неожиданных крайних случаев. В процессе разработки, управляемой тестированием, крайние случаи могут быть определены системными требованиями и учтены в тестах до написания кода. Такая документация может быть включена в документ с требованиями к продукту после обсуждения с заинтересованными сторонами и другими командами.