2014-05-07 7 views
12

Non capisco il concetto di software testing oracle. DiceChe cos'è un test oracle e a cosa serve?

Un oracolo è un meccanismo per determinare se il programma ha superato o fallito un test.

Si consideri il seguente codice:

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

La classe che dovrebbe essere testato sempre restituisce la somma di 2 numeri interi.
Passo come parametro 2 e 3, e aspetto che 5. 2 e 3 vengano sommati e confrontati con il valore atteso (5). In questo caso il test ha esito positivo.

In che modo esattamente un oracolo può aiutarmi qui? Un oracolo è coinvolto in questo esempio?

+0

Sono interessato a conoscere anche questo, dal momento che il concetto di un oracolo di prova mi ha sempre colpito come un concetto vago.La mia comprensione (che potrebbe essere sbagliata, quindi il mio interesse) è che un corridore di prova è un esempio di oracolo di prova. (Nel tuo caso, l'oggetto 'tester'.) – Lilshieste

risposta

9

Un test oracle è una fonte di informazioni sul fatto che l'output di un programma (o funzione o metodo) sia corretto o meno.

Un test oracle potrebbe specificare l'uscita corretta per tutti gli input possibili o solo per input specifici. Potrebbe non specificare i valori di output effettivi ma solo i vincoli su di essi.

L'oracolo potrebbe essere

  • un programma (distinto dal sistema in prova) che tiene lo stesso ingresso e produce lo stesso output
  • documentazione che illustra uscite corretti specifici per specifici ingressi trovati
  • un algoritmo documentato che un essere umano potrebbe utilizzare per calcolare le uscite corrette per determinati input
  • un esperto di dominio umano che può in qualche modo esaminare l'output e dire se è corretto
  • o qualsiasi altro modo di dire che l'uscita è corretta.

Se non è vago, il concetto è almeno molto ampio.

Un oracle non è un runner di test, ma un corridore di test potrebbe utilizzare un oracle come fonte di output corretto a cui confrontare l'output del sistema sotto test o come una fonte di vincoli con cui valutare il L'output di SUT.

Nel tuo esempio, hai utilizzato la tua capacità personale di eseguire l'algoritmo di aggiunta come oracolo. Invece, si potrebbe utilizzare una diversa attuazione di tale algoritmo come un oracolo:

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

Dato che effettivamente non abbiamo bisogno dei risultati, e non dobbiamo calcolarlo da soli, questa versione potrebbe anche più oracly:" assertEquals ("2 + 3", 2 + 3, tester.sum (2, 3)); ' –

1

Permettetemi di porre la questione di Oracle in questo modo: come possiamo verificare che il programma restituisce la risposta giusta?

Per questa funzione, si può controllare facilmente la risposta con il seguente pseudocodice (Siamo spiacenti, non è C++.):

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

Questo Oracle utilizza la sottrazione per verificare la funzione. Ciò consente di eseguire milioni o miliardi di test con poco sforzo umano.