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

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

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

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

// 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 и 3 и ожидаю 5. 2 и 3 будут суммированы и сравнены с ожидаемым значением (5). В этом случае тест будет успешным.

Как точно мне может помочь оракул? В этом примере участвует оракул?

Ответ 1

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

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

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

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

Если это не смутно, понятие, по крайней мере, очень велико.

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

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

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

Ответ 2

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

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

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

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