Quali sono le migliori pratiche per testare programmi con comportamento stocastico?

12

Facendo un lavoro di R & D, mi trovo spesso a scrivere programmi con un certo grado di casualità nel loro comportamento. Ad esempio, quando lavoro in Genetic Programming, scrivo spesso programmi che generano ed eseguono codice sorgente casuale arbitrario.

Un problema con il test di questo codice è che i bug sono spesso intermittenti e possono essere molto difficili da riprodurre. Questo va oltre l'impostazione di un seme casuale sullo stesso valore e l'avvio dell'esecuzione.

Ad esempio, il codice potrebbe leggere un messaggio dal buffer dell'anello kernal e quindi eseguire salti condizionali sul contenuto del messaggio. Naturalmente, lo stato del buffer dell'anello sarà cambiato quando uno più tardi tenta di riprodurre il problema.

Anche se questo comportamento è una funzione può attivare altri codici in modi imprevisti, e quindi spesso rivela bug che i test di unità (o tester umani) non trovano.

Esistono best practice consolidate per testare sistemi di questo tipo? Se è così, alcuni riferimenti sarebbero molto utili. In caso contrario, qualsiasi altro suggerimento è benvenuto!

    
posta John Doucette 18.10.2012 - 15:32
fonte

4 risposte

6

È utile aggiungere ganci, come suggerito, per ricreare stati esatti. Inoltre, strumenta il sistema in modo che possa scaricare i suoi "semi" (nel tuo caso, inclusi il seme PRNG e il buffer dell'anello del kernel, e qualsiasi altra fonte di input non deterministico.)

Quindi esegui i test sia con input casuale vero, sia con stile regressivo con eventuali casi interessanti scoperti in precedenza.

Nel caso particolare del tuo accesso al kernel, mi raccomando di fare un finto in ogni caso. Usa la simulazione per forzare le classi di equivalenza che hanno meno probabilità di apparire in pratica, nello spirito di "vuoto" e "pieno" per i contenitori, o "0, 1, 2 ^ n, 2 ^ n + 1, molti" per cose numerabili. Quindi puoi testare con la simulazione e con la realtà, sapendo di aver gestito e testato i casi che hai pensato fino ad ora.

Fondamentalmente, quello che sto suggerendo equivale a un mix di input deterministici e non deterministici, con quelli deterministici che sono un mix di quelli a cui riesci a pensare e quelli di cui eri sorpreso.

    
risposta data 18.10.2012 - 23:10
fonte
6

Una cosa ragionevole da fare è seminare il generatore di numeri casuali con un valore costante per i test, in modo da ottenere un comportamento deterministico.

    
risposta data 18.10.2012 - 15:59
fonte
2

Penso che i test statistici siano l'unico modo. Proprio come i numeri casuali sono "testati" per casualità da test statistici, quindi devono essere algoritmi che usano comportamenti casuali.

Basta eseguire l'algoritmo più volte con input uguali o diversi e confrontarli tra loro. Il problema con questo approccio è l'enorme aumento del tempo di calcolo richiesto per completare il test.

    
risposta data 19.10.2012 - 08:23
fonte
2

Non sono uno specialista in questo settore, ma esiste una letteratura scientifica relativa al test del programma stocastico.

Se non è possibile creare facilmente classi di test, è possibile utilizzare un test statistico, come affermato da #Euphoric. Borning et al. mettono a confronto un approccio tradizionale e uno statistico. Una generalizzazione dei test statistici suggeriti da @Euphoric potrebbe essere quella discussa da Whittaker. Ha suggerito di creare un modello stocastico del comportamento desiderato (stocastico, nel tuo caso) e quindi generare casi di test specifici da questo modello (vedi il suo articolo dedicato ).

    
risposta data 19.10.2012 - 11:43
fonte

Leggi altre domande sui tag