¿Cuáles son algunas de las razones por las que el código de prueba de software pasa de forma aislada pero falla cuando se ejecutan varias pruebas?

Algunas veces las pruebas tienen efectos secundarios. Por ejemplo, supongamos que estamos comprobando la siguiente clase:

clase pública A {
static int cnt = 0;
public int incrementAndReturn () {
cnt ++;
return cnt;
}
}

Y hemos escrito las siguientes pruebas:

ATEST de clase pública {
@Prueba
public void testIncrementOnce () {
A a = nuevo A ();
int resultado = a.incrementAndReturn ();
ClaimEquals (1, resultado);
}
@Prueba
public void testIncrementTwice () {
A a = nuevo A ();
a.incrementAndReturn ();
int resultado = a.incrementAndReturn ();
ClaimEquals (2, resultado);
}
}

Entonces, cada prueba aislada será correcta, pero cuando se ejecutan juntas, el valor de cnt será diferente de cero para la segunda prueba (dado que es una variable estática, solo se inicializa una vez).

Otros casos incluyen operaciones de E / S. Por ejemplo, dos (o más) pruebas pueden suponer que un archivo no existe y que lo crean. Luego, cuando se ejecutan juntos, la suposición de la segunda prueba fallará.

Estado y tiempo.

Las pruebas se basan en algún estado que se mantiene y luego se restablecen en algún lugar.

Esto podría deberse a que los métodos de desmontaje no funcionan. Puede ser que la unidad bajo prueba esté cableada para ser una vez por conjunto de pruebas, no una vez por prueba.

Puede ser el almacenamiento de datos o un servicio web conectado.

Algún código es sensible al tiempo. Quizás usa un caché de un segundo, por ejemplo (yo uso esos). Por lo tanto, si las pruebas se ejecutan con un segundo o más de diferencia, obtendrá una pérdida / recarga de caché. Si los ejecutas más rápido, obtienes hits de caché. Si la afirmación es para ‘caché fallar’, fallará.

Las pruebas de navegador como las pruebas de selenio me parecen similares: pueden volverse escamosas a toda velocidad, ya que los elementos no aparecen del todo cuando deberían.

Yo recomendaría no llamar a algo que ejecuta como ‘pruebas’. Sé que esto es muy común entre los desarrolladores / desarrolladores de software.

Es mejor decir que mi código (de prueba) funciona de una manera cuando lo ejecuto de forma aislada y funciona de otra manera cuando lo ejecuto junto con otro código o cuando otro código se ejecuta antes del código en cuestión. Eso cambia el enfoque innecesario en la palabra ‘prueba’.

Estoy seguro de que hay muchas razones por las cuales el código afecta a otro código: cambios en el estado de la máquina, cambios en el estado del software, cambios en la base de datos, otros …

Como comentario aparte, ¿qué es la prueba?

Si el estado inicial no se restablece, entonces hay un error acumulado de la ejecución anterior. Esto incluye el reinicio incorrecto de archivos temporales y pérdidas de memoria. Esto puede ser invisible de forma aislada, debido a los recursos. Es más un caso cuando las pruebas se ejecutan de forma aislada en lugar del programa.

Si el programa es multiproceso, los subprocesos pueden sincronizarse incorrectamente y ejecutarse correctamente por casualidad en ocasiones. (Aka condición de carrera).

Puede haber dependencias externas (recursos disponibles) que solo a veces son gratuitas.

En un error relacionado, si el programa se ejecuta en un sistema operativo multitarea, las restricciones de memoria dinámica pueden fallar al azar, dependiendo de lo que se esté ejecutando.

Si el programa accede a fuentes de datos en tiempo real todo el tiempo, puede haber errores en el manejo de ciertos valores o tipos de datos que no están expuestos en algunas pruebas.

Si el programa realiza suposiciones de tiempo (como el tiempo que tardará algo en responder), fallará al azar, especialmente en una computadora ocupada.

More Interesting

¿Por qué las empresas confían en los discos duros magnéticos para el almacenamiento de datos cuando las unidades de disco duro que no son de estado sólido son tan susceptibles a fallas, es decir, una tasa de falla del 100% dentro de una década?

¿Cómo debo prepararme para una entrevista telefónica con Citrix y qué debo esperar?

¿Qué deben saber todos los ingenieros de software sobre Python?

Renuncié a mi trabajo porque mi salario no era tan bueno. Estaba trabajando como ingeniero de software, luego me uní a una pequeña empresa de ventas con un mejor salario, pero después de venir aquí no veo futuro. ¿Qué debería hacer ahora?

Si los fundadores de los sitios web sociales fueran realmente altruistas, ¿no habrían creado protocolos en lugar de sitios web?

¿Por qué y cómo usan los ingenieros eléctricos C ++?

Cómo encontrar un socio en Alemania para expandir nuestros servicios de desarrollo de software en el mercado alemán

¿Por qué muchas personas suponen que la POO está en declive?

¿Qué es una estructura de datos?

¿Cómo es útil GitHub para la programación y el desarrollo de software?

Soy estudiante de ingeniería de software. Quiero construir un modelo de procesamiento de información cerebral a nivel de computadoras. ¿Cómo debo comenzar?

Cómo crear un software de algoritmo combinado

¿Cómo los juegos como FIFA generan comentarios basados ​​en el juego en tiempo real?

¿Puede un ingeniero de software comprar un Jaguar?

Cómo realizar pruebas de API