Какие тестовые случаи (проверки) нужно разработать для валидации числового интервала?

Ответ

Для всесторонней проверки числового интервала применяется техника анализа граничных значений (Boundary Value Analysis). Тестируются значения на границах и рядом с ними.

Рекомендуемый набор проверок для интервала [min, max]:

  1. Допустимые граничные значения (валидные):

    • min — минимальное допустимое значение.
    • max — максимальное допустимое значение.
    • Любое значение внутри интервала (например, (min + max) / 2).
  2. Недопустимые граничные значения (невалидные):

    • min - 1 — значение сразу ниже нижней границы.
    • max + 1 — значение сразу выше верхней границы.
  3. Специальные и крайние случаи:

    • Пустое значение (если поле не обязательное).
    • Нулевое значение (0), если оно входит или не входит в интервал.
    • Отрицательные числа (если логика домена это допускает).
    • Дробные числа (если тип поля это поддерживает).
    • Очень большие числа (проверка на переполнение).
    • Нечисловые значения (буквы, символы) — должна быть обработка ошибки.

Практический пример на Python для интервала [1, 10]:

def is_value_in_interval(value):
    """Проверяет, входит ли значение в интервал [1, 10]."""
    return 1 <= value <= 10

# Валидные тест-кейсы (ожидается True)
assert is_value_in_interval(1)   # Нижняя граница
assert is_value_in_interval(10)  # Верхняя граница
assert is_value_in_interval(5)   # Внутреннее значение

# Невалидные тест-кейсы (ожидается False)
assert not is_value_in_interval(0)   # Ниже границы
assert not is_value_in_interval(11)  # Выше границы
# Для нечислового ввода потребуется отдельная проверка с обработкой исключений.

Такой подход позволяет выявить ошибки в условиях сравнения (<= vs <).

Ответ 18+ 🔞

А, ну вот, опять эти ваши границы, блядь! Сидишь, тестируешь, а потом бац — и всё падает, потому что какой-то пидрила в коде написал не <=, а <. И кто потом виноват? Я, блядь, тестировщик!

Так вот, слушай сюда, раз уж полез в эту тему. Есть такая штука — анализ граничных значений. Суть проще, чем кажется, хоть и звучит, как ёперный театр. Берёшь свой интервал, допустим, от min до max, и начинаешь его ебашить со всех сторон.

Что надо проверять, чтобы не выглядеть потом конченым идиотом:

  1. Нормальные, годные значения (должны проходить):

    • Самый нижний порог — min. Если он заявлен как допустимый, то должен работать, блядь!
    • Самый верхний потолок — max. Тоже должен.
    • Ну и что-то посерединке, типа (min + max) / 2. Чтобы просто убедиться, что середина не провалилась в тартарары.
  2. Откровенно левые, негодные значения (должны отшиваться):

    • min - 1 — значение, которое уже чуть-чуть не влезает. Прямо под самой границей.
    • max + 1 — значение, которое уже чуть-чуть вылезло. Прямо над границей. Вот на этих двух, сука, чаще всего и ловят баги, когда разработчик перепутал строгое и нестрогое сравнение.
  3. И, конечно, всякая дополнительная хуйня, от которой система должна не сдохнуть, а красиво послать нахуй:

    • Пустота. Ничего не ввёл — что будет?
    • Ноль. Он часто бывает особо хитрожопым значением.
    • Отрицалово, если по смыслу может быть.
    • Дробные числа, если поле не целое.
    • Числа, от которых комп зависнет — типа десять в сотой степени.
    • Буквы, символы, смайлики. Программа не должна от этого взрываться, а должна сказать: «Чувак, ты долбоёб, вводи цифры».

Смотри, как это выглядит в коде, на примере интервала от 1 до 10:

def is_value_in_interval(value):
    """Проверяет, входит ли значение в интервал [1, 10]."""
    return 1 <= value <= 10  # Вот тут, блядь, именно <=, а не <

# Проверяем, что годное проходит
assert is_value_in_interval(1)   # Самая нижняя планка
assert is_value_in_interval(10)  # Самая верхняя планка
assert is_value_in_interval(5)   # Что-то из середины

# Проверяем, что негодное отшивается
assert not is_value_in_interval(0)   # Чуть ниже — уже нет
assert not is_value_in_interval(11)  # Чуть выше — тоже нет
# А с буквами тут будет исключение, его надо отдельно ловить, это уже другая история.

Вот такой подход, блядь, и позволяет поймать момент, когда дядя-программист, не выспавшись, написал value < 10 вместо value <= 10. И тогда на значении 10 всё ебётся, а ты сидишь и думаешь: «Ну ядрёна вошь, кто же так делает-то?». А делает так каждый второй, если его не проверять.