Что такое тестовый оракул, и для чего он используется?

Я действительно не понимаю концепцию тестирование программного обеспечения oracle. Тут написано

oracle-это механизм для определения того, прошла или не прошла программа тест.

рассмотрим следующий код:

// class that should be tested
public int sum(int a, int b) {
  return a + b;
}

// test class
static Main tester = new Main();
@Test
public void testSum() {
  assertEquals("2 + 3 is 5", 5, tester.sum(2, 3));
}

класс, который должен быть протестирован, всегда возвращает сумму 2 целых чисел.
Я передаю как параметр 2 и 3 и ожидаю 5. 2 и 3 будут суммированы и сопоставлены с ожидаемым значением (5). В в этом случае тест проходит успешно.

как именно оракул может помочь мне здесь? Участвует ли в этом примере оракул?

2 ответов


тестовый оракул является источником информации о том, является ли вывод программы (или функции или метода) правильным или нет.

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

оракул может быть

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

если не расплывчато, понятие, по крайней мере, очень широкое.

oracle не является тестом бегун, но тестовый бегун может использовать oracle как источник правильного вывода, с которым можно сравнить вывод тестируемой системы, или как источник ограничений, с которыми можно оценить вывод SUT.

в вашем примере вы использовали свою личную способность выполнять алгоритм сложения в качестве своего оракула. Вместо этого вы можете использовать другую реализацию этого алгоритма в качестве oracle:

assertEquals("2 + 3 is 5", 2 + 3, tester.sum(2, 3));

позвольте мне задать вопрос oracle следующим образом: как мы можем проверить, что программа возвращает правильный ответ?

для этой функции мы можем легко проверить ответ со следующим псевдокодом (извините, это не C++.):

repeat many times {
    int a = randomNumber();
    int b = randomNumber();
    int result = sum(a, b);
    assertEquals("random case", a, result - b);
}

этот oracle использует вычитание для проверки функции. Это позволяет проводить миллионы или миллиарды тестов с минимальными человеческими усилиями.