Что такое тестовый оракул (Test Oracle)?

Ответ

Тестовый оракул — это источник истины или механизм, который определяет, является ли результат выполнения теста правильным. Это критерий для проверки соответствия фактического результата работы системы ожидаемому.

Пример простого оракула в коде:

def add(a, b):
    return a + b

# Оракул — наше знание, что 2 + 3 должно равняться 5
expected_result = 5
actual_result = add(2, 3)
assert actual_result == expected_result, f"Expected {expected_result}, got {actual_result}"

Типы тестовых оракулов:

  1. Спецификация/Документация: Формальные требования.
  2. Эталонная система (Reference Implementation): Рабочая старая версия или эталонный алгоритм.
  3. Эвристики и инварианты: Логические правила (например, «баланс счета не может быть отрицательным», «дата окончания позже даты начала»).
  4. Статистические данные или исторические результаты.
  5. Оракул, созданный человеком: Экспертная оценка для сложных выводов (например, качество изображения).

Проблема оракула: Часто является самой сложной частью тестирования. Оракул может быть:

  • Отсутствующим (нет четких критериев).
  • Неточным (основан на допущениях).
  • Непрактичным (слишком дорогой для вычисления).

Ответ 18+ 🔞

Слушай, а вот тестовый оракул — это, по сути, твой главный стукач в мире тестирования. Это такая сука, которая тебе на ушко шепчет: «Всё правильно, браток, можно идти дальше» или «Э, нет, ёпта, тут пиздец, что-то пошло не так». Источник истины, блядь, эталон, с которым ты сверяешься.

Вот смотри, простейший пример, чтоб не ебать мозг:

def add(a, b):
    return a + b

# Оракул — это наше железобетонное знание из детсада, что 2 + 3 = 5
expected_result = 5
actual_result = add(2, 3)
assert actual_result == expected_result, f"Expected {expected_result}, got {actual_result}"

Видишь? Оракул — это вот эта цифра 5. Если функция вернула не пять, а, допустим, шесть — значит, она ебнулась, и мы её нахуй отправляем на доработку.

А теперь, блядь, самое интересное — откуда эти оракулы вообще берутся? Вариантов — овердохуища:

  1. Бумажка (Спецификация). Там, где какой-нибудь менеджер-распиздяй накалякал: «Система должна делать так-то». Ну, типа, истина в последней инстанции, если, конечно, он не был в запое, когда писал.
  2. Старая, добрая, рабочая версия (Эталонная система). Вот у тебя была программа, которая внатуре работала. Ты написал новую, крутую. И ты гоняешь их обеих на одних и тех же данных. Если старая выдала Х, а новая — У, и они не сошлись — пидарас шерстяной, новая версия где-то накосячила.
  3. Здравый смысл, он же инвариант (Эвристики). Это когда ты знаешь железное правило, которое не должно нарушаться. Типа, «дата вылета не может быть раньше даты прилёта» или «баланс на счету не может уйти в минус нахуй, если ты не банк». Нарушилось — всё, волнение ебать, ищи баг.
  4. Исторические данные. Раньше система на этих входных данных выдавала вот такой результат. Берём его за истину. Правда, есть риск, что и старая-то система ошибалась, но это уже другой пиздец.
  5. Человек-оракул. Самый дорогой и ненадёжный вид. Когда результат настолько хитровыебанный (типа, «красиво ли сгенерировалась картинка»), что только живой эксперт, вручную, глазами, может сказать — да, норм, или нет, пизда.

И вот тут, сука, кроется главная засада — Проблема оракула. Часто бывает так, что проверить-то результат проще простого, а вот узнать, какой он должен быть — это пиздец задача. Оракул может быть:

  • Вообще хуй знает где (Отсутствующий). Требований нет, старой системы нет, инвариантов не придумать. Просто «сделай красиво». Ну, удачи, блядь.
  • Кривой и косой (Неточный). Основан на каких-то допущениях, которые могут быть хуёвыми.
  • Золотой (Непрактичный). Чтобы его вычислить, нужно потратить столько ресурсов, что проще запустить производство заново.

Вот так и живём, блядь. Ищем эту самую «истину», чтобы понять, работает ли наша хитроумная хуйня или это просто мартышлюшка какая-то.