La inyección de fallas es una técnica para mejorar la calidad de las pruebas al involucrar las fallas intencionales en el software. La inyección de fallas a menudo se encuentra en las pruebas de estrés y se considera una parte importante del desarrollo de software robusto.
La transmisión de una falla a una falla notable sigue un ciclo bien definido. Durante la ejecución, una falla puede causar un error que no es un estado válido dentro de los límites del sistema. El mismo error puede causar más errores dentro del límite del sistema, por lo que cada nuevo error actúa como una falla y puede propagarse al límite del sistema y ser observable. Cuando se observa un estado de error en el límite del sistema, se denomina falla.
Clasificación de la inyección de fallas:
la inyección de fallas se puede clasificar en dos tipos según la implementación del software: inyección de fallas en tiempo de compilación e inyección de fallas en tiempo de ejecución. Estos se explican a continuación a continuación.
1. Inyección de fallas en tiempo de compilación:
la inyección de fallas en tiempo de compilación es una técnica de inyección de fallas en la que el código fuente se modifica para inyectar fallas imitadas en un sistema.
Se utilizan dos métodos para implementar fallas durante el tiempo de compilación:
- Modificación de código:
las pruebas de mutación se utilizan para cambiar las líneas de código existentes para que puedan existir fallas. La mutación de código produce fallas que son similares a las fallas involuntarias que cometen los programadores.Ejemplo:
Original Code: int main() { int a = 10; while ( a > 0 ) { cout << "GFG"; a = a - 1; } return 0; } Modified Code: int main() { int a = 10; while ( a > 0 ) { cout << "GFG"; a = a + 1; // '-' is changed to '+' } return 0; }
Ahora se puede observar que el valor de a aumentará y el «bucle while» nunca terminará y el programa entrará en un bucle infinito.
- Inserción de código:
un segundo método de mutación de código es la inyección de errores de inserción de código, que agrega código en lugar de modificar el código existente. Esto se hace básicamente mediante el uso de funciones de ansiedad, que son funciones simples que toman un valor existente y lo cambian mediante alguna lógica a otro valor.Ejemplo:
Original Code: int main() { int a = 10; while ( a > 0 ) { cout << "GFG"; a = a - 1; } return 0; } Modified Code: int main() { int a = 10; while ( a > 0 ) { cout << "GFG"; a = a - 1; a++; // Additional code } return 0; }
Ahora se puede observar que el valor de a será fijo y el «bucle while» nunca terminará y el programa entrará en un bucle infinito.
2. Inyección de fallas en tiempo de ejecución:
la técnica de inyección de fallas en tiempo de ejecución utiliza un disparador de software para inyectar una falla en un sistema de software en ejecución. Las fallas se pueden inyectar a través de varios métodos físicos y los disparadores se pueden implementar de diferentes maneras.
Disparadores de software utilizados en la inyección de fallas en tiempo de ejecución:
1. Time Based Triggers 2. Interrupt Based Triggers
Se utilizan 3 métodos para inyectar fallas durante el tiempo de ejecución:
- Corrupción del espacio de la memoria:
este método consiste en corromper la memoria principal y los registros del procesador. - Interposición de llamadas al sistema:
este método está relacionado con la imitación de fallas de las interfaces del kernel del sistema operativo para ejecutar el software del sistema. Esto se hace interceptando las llamadas al sistema operativo realizadas por el software de nivel de usuario e inyectando fallas en ellas. - Nivel de red:
este método está relacionado con la corrupción, pérdida o reordenación de paquetes de red en la interfaz de red.
Inyección de fallas en diferentes pruebas de software:
- (a) Pruebas de robustez: en las pruebas de robustez se utiliza la inyección de fallas.
- (b) Pruebas de estrés: la inyección de fallas también se usa en las pruebas de estrés.