¿Cuáles son las mejores prácticas para probar programas con comportamiento estocástico?

12

Haciendo trabajo de I + D, a menudo me encuentro escribiendo programas que tienen un alto grado de aleatoriedad en su comportamiento. Por ejemplo, cuando trabajo en programación genética, a menudo escribo programas que generan y ejecutan código fuente aleatorio arbitrario.

Un problema con la prueba de dicho código es que los errores son a menudo intermitentes y pueden ser muy difíciles de reproducir. Esto va más allá de simplemente establecer una semilla aleatoria en el mismo valor y comenzar de nuevo la ejecución.

Por ejemplo, el código puede leer un mensaje del búfer de anillo del kernal y luego hacer saltos condicionales en el contenido del mensaje. Naturalmente, el estado del búfer de anillo habrá cambiado cuando uno intente reproducir el problema más adelante.

A pesar de que este comportamiento es una característica , puede desencadenar otro código de formas inesperadas y, por lo tanto, a menudo revela errores que las pruebas de unidades (o probadores humanos) no encuentran.

¿Se han establecido las mejores prácticas para probar sistemas de este tipo? Si es así, algunas referencias serían muy útiles. Si no, ¡cualquier otra sugerencia es bienvenida!

    
pregunta John Doucette 18.10.2012 - 15:32

4 respuestas

6

Es útil agregar ganchos, como se sugiere, para recrear estados exactos. Instale también el sistema para que pueda volcar sus "semillas" (en su caso, incluida la semilla de PRNG y el búfer de anillo del núcleo, y cualquier otra fuente de información no determinista).

Luego, ejecute sus pruebas con entradas aleatorias verdaderas y estilo de regresión con cualquier caso interesante descubierto previamente.

En el caso particular de tu acceso al kernel, recomiendo hacer un simulacro en cualquier caso. Utilice el simulacro para forzar clases de equivalencia que tienen menos probabilidades de aparecer en la práctica, en el espíritu de "vacío" y "lleno" para contenedores, o "0, 1, 2 ^ n, 2 ^ n + 1, muchos" para Cosas contables. Luego, puedes probar con el simulacro y con el objeto real, sabiendo que has manejado y probado los casos que has pensado hasta ahora.

Básicamente, lo que estoy sugiriendo equivale a una mezcla de aportes deterministas y no deterministas, y los deterministas son una mezcla de aquellos en los que puedes pensar y de los que te sorprendió.

    
respondido por el Stephan A. Terre 18.10.2012 - 23:10
6

Una cosa razonable para hacer es sembrar el generador de números aleatorios con un valor constante para las pruebas, para que obtenga un comportamiento determinista.

    
respondido por el Dima 18.10.2012 - 15:59
2

Creo que la prueba estadística es la única manera. Al igual que los números aleatorios se "prueban" para la aleatoriedad mediante pruebas estadísticas, también deben ser algoritmos que utilicen el comportamiento aleatorio.

Simplemente ejecute el algoritmo varias veces con la misma o diferente entrada y compárelo entre sí. El problema con este enfoque es el aumento masivo en el tiempo de cómputo requerido para finalizar las pruebas.

    
respondido por el Euphoric 19.10.2012 - 08:23
2

No soy un especialista en este dominio, pero hay una literatura científica relacionada con las pruebas estocásticas del programa.

Si no puede crear fácilmente clases de prueba, se puede usar una prueba estadística, como dice #Euphoric. Borning et al. comparan un enfoque tradicional y uno estadístico. Una generalización de las pruebas estadísticas sugeridas por @Euphoric podría ser la discutida por Whittaker. Sugirió crear un modelo estocástico del comportamiento deseado (estocástico, en su caso) y luego generar casos de prueba específicos a partir de este modelo (ver su papel dedicado ).

    
respondido por el mgoeminne 19.10.2012 - 11:43

Lea otras preguntas en las etiquetas