Sto cercando una libreria che posso usare per aiutare a deridere un componente del programma che funziona solo in modo intermittente - di solito, funziona bene, ma a volte fallisce.
Ad esempio, supponiamo di dover leggere i dati da un file e il mio programma deve evitare di bloccarsi o bloccarsi quando una lettura non riesce a causa di un arresto anomalo della testa del disco. Mi piacerebbe modellarlo avendo una funzione di lettore di dati simulato che restituisce dati falsi il 90% delle volte, ma blocca o restituisce spazzatura in caso contrario. Oppure, se sto sottoponendo a prove di stress il mio programma completo, potrei attivare il codice di debug nel mio vero modulo di lettore di dati per fare in modo che restituisca dati reali il 90% delle volte e si blocchi altrimenti.
Ora, ovviamente, in questo particolare esempio potrei semplicemente programmare il mio simulatore manualmente per testare una routine random()
. Tuttavia, stavo cercando un sistema che consenta l'implementazione di qualsiasi politica di errore che desidero, tra cui:
- Fallisce casualmente il 10% delle volte
- Riuscire 10 volte, fallire 4 volte, ripetere
- Fallisce in modo semi-casuale, in modo tale che un errore tende a essere seguito da una serie di altri fallimenti
- Qualsiasi criterio che il tester desideri definire
Inoltre, mi piacerebbe essere in grado di modificare la politica di errore in fase di esecuzione, utilizzando le manopole o gli switch esterni che possono essere rimossi (insieme al resto della libreria) prima di spedire il codice. (Se il componente è caricato da un'infrastruttura per le dipendenze, potremmo fornire la simulazione come un'implementazione nella versione di prova e trattenerla dalla build spedita.)
In pig-Java, immaginerei un'interfaccia FailureFaker
in questo modo:
interface FailureFaker {
/**
Return true if and only if the mocked operation succeeded.
Implementors should override this method with versions consistent
with their failure policy.
*/
public boolean attempt();
}
E ogni criterio di errore sarebbe una classe che implementa FailureFaker
; per esempio ci sarebbe un PatternFailureFaker
che avrebbe avuto successo N volte, poi fallire M volte, poi ripetere, e un AlwaysFailFailureFaker
che userei temporaneamente quando ho bisogno di simulare, ad esempio, qualcuno che rimuove il mio disco esterno i miei dati era su. La politica potrebbe quindi essere utilizzata (e modificata) nel mio codice oggetto simulato in questo modo:
class MyMockComponent {
FailureFaker faker;
public void doSomething() {
if (faker.attempt()) {
// ...
} else {
throw new RuntimeException();
}
}
void setFailurePolicy (FailureFaker policy) {
this.faker = policy;
}
}
Ora, questo sembra essere qualcosa che farebbe parte di una biblioteca derisoria, quindi non sarei sorpreso se fosse stato fatto prima. (In realtà, ho avuto l'idea da Scrittura di codice solido di Steve Maguire, dove ha discute questa idea esatta alle pagine 228-231, dicendo che tali strutture erano comuni nel codice Microsoft di quell'era degli anni '90.) Tuttavia, ho solo familiarità con EasyMock e jMockit per Java, e nessuno dei due AFAIK ha questa funzione, o qualcosa del genere simile con diversa sintassi.
Quindi, la domanda: esistono librerie come quelle sopra descritte? Se lo fanno, dove li hai trovati utili? Se non li hai trovati utili, perché no?