Sono abituato a scrivere test di unità con asserzioni basate sull'input, ad es. (si spera autoesplicativo e supponiamo che l'uso di dati di test casuali sia corretto)
int a = random();
int b = random();
Adder instance = new Adder();
int expResult = a+b;
int result instance.add(a, b);
assertEquals(expResult, result);
Supponiamo che Adder.add
abbia molti effetti collaterali che non riesco a immaginare, quindi questo test avrebbe senso.
Ora, ho riscontrato una situazione in cui avrebbe senso creare asserzioni basate sull'output, ad es.
int a = random();
int b = random();
Multiplier instance = new Multiplier();
int result = instance.multiply(a, b);
if(isPrimeNumber(result)) {
assertTrue(a == 1 || b == 1);
}else {
//some other assertions...
}
Sì, questo è un test senza senso e verifica più il funzionamento dei numeri razionali che altro, ma illustra la differenza tra basare le asserzioni solo sull'input e fare in modo che il risultato di output / test influenzi le asserzioni.
Suppongo che io copra tutti i possibili stati di output distinti del test, proprio come supponevo che coprissi tutti i possibili stati di input.