Ho una serie di funzioni molto simili alla definizione matematica di una funzione . Ad esempio, una versione semplificata di una di queste funzioni può essere simile a:
int function foo(int a, int b) {
return a * b;
}
Mi piacerebbe testarli unitamente, ma non sono sicuro di quale sia il modo migliore per avvicinarsi a questi test, poiché queste funzioni hanno intervalli molto ampi per i valori dei parametri. Ogni approccio che ho trovato mi sembra carente:
- Se provo con un sottoinsieme discreto e predefinito di possibili valori, temo che il set che scelgo possa non essere rappresentativo del tutto, portando a un ciclo potenzialmente infinito di aggiungere nuovi valori al sottoinsieme ogni volta che un valore imprevisto è trovato. Questo sembra come sconfiggere il punto di avere un test unitario in primo luogo.
- Se provo con un sottoinsieme discreto di valori possibili determinati casualmente, eredito tutti i problemi relativi alla selezione manuale del sottoinsieme oltre alla reale possibilità che i test falliscano casualmente ogni volta.
- Se provo con tutti i valori possibili (ad es. da 0 a 2 64 ), i test richiederanno per sempre.
Il mio pensiero finale su come affrontare il problema è stato quello di evitare di testare l'implementazione della funzione interamente, o tramite:
- Verifica solo che la funzione accetta due interi e restituisce un intero o
- Non testare affatto la funzione
Ma se non sto testando le funzioni - in pratica o in linea di principio - non sono sicuro di come possa garantire la correttezza delle funzioni nel caso di un eventuale refactoring.
Qual è il modo migliore per testare funzioni che hanno un output completamente deterministico, ma possono operare su una vasta gamma di possibili input?