O que é um oráculo de teste, e para que é utilizado?

Não entendo o conceito de um oráculo de teste de software. Diz:

um oráculo é um mecanismo para determinar se o programa passou ou falhou num teste.

considere o seguinte código:

// 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));
}

a classe que deve ser testada devolve sempre a soma de 2 inteiros.
Passo como parâmetro 2 e 3, e espero 5. 2 e 3 serão resumidos e comparados com o valor esperado (5). Neste caso, o teste suceder.

Como é que um oráculo me pode ajudar aqui? Um oráculo está envolvido neste exemplo?

Author: Dave Schweisguth, 2014-05-07

2 answers

Um oráculo de teste é uma fonte de informação sobre se a saída de um programa (ou função ou método) é correta ou não.

Um oráculo de ensaio pode especificar a saída correcta para toda a entrada possível ou apenas para uma entrada específica. Ele pode não especificar os valores reais de saída, mas apenas restrições sobre eles.

O oráculo pode ser ...
  • UM programa (separado do sistema em teste) que recebe a mesma entrada e produz a mesma saída
  • documentação que dá Saídas específicas correctas para determinadas entradas
  • um algoritmo documentado que um ser humano pode usar para calcular as saídas correctas para determinadas entradas
  • um especialista em domínio humano que de alguma forma pode olhar para o resultado e dizer se está correcto
  • ou qualquer outra forma de dizer que a saída está correcta.
Se não for vago, o conceito é, pelo menos, muito amplo. Um oráculo não é um test runner, mas um test runner pode usar um oráculo como uma fonte de saída correcta para que para comparar a saída do sistema-under-test, ou como uma fonte de restrições contra as quais avaliar a saída do SUT. No seu exemplo, usou a sua capacidade pessoal para executar o algoritmo da adição como seu oráculo. Em vez disso, você poderia usar uma implementação diferente desse algoritmo como um oráculo:
assertEquals("2 + 3 is 5", 2 + 3, tester.sum(2, 3));
 11
Author: Dave Schweisguth, 2014-05-31 14:28:04
Deixe - me colocar a questão do oráculo desta forma: como podemos verificar se o programa retorna a resposta certa?

Para esta função, podemos facilmente verificar a resposta com o seguinte pseudocode (Desculpe, não é c++.):

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

Este oráculo usa a subtracção para verificar a função. Isso permite que milhões ou bilhões de testes sejam executados com pouco esforço humano.

 2
Author: Paul, 2016-02-13 22:10:34