Laboratorio Jianyuan | Prueba de cobertura estructurada de código de software: cobertura de sucursales

Autor |  Li Wei Director del Departamento de Evaluación de Seguridad de Shanghai Control Security

Fuente |  Laboratorio Jianyuan

Comunidad |  Agregue el ID de WeChat " TICPShanghai " y únase a la "Comunidad de seguridad Shanghai Kongan 51fusa"

Introducción:  Al comienzo del artículo anterior, presentamos la prueba de cobertura de la estructura del código del cuadro blanco. Hemos completado la explicación de la prueba de cobertura de la declaración. En este artículo, presentamos la cobertura de la rama.

01

sobre la definición

En términos del grado en que las técnicas de prueba pueden probar el código, en código complejo, la cobertura de rama es mejor que la cobertura de declaración. Muchas veces la cobertura de sucursales también se llama cobertura de decisión. La cobertura de declaraciones es el requisito de diseñar casos de prueba para que todas las declaraciones puedan probarse. La cobertura de ramas requiere que todas las ramas de decisión lógica en el código sean probadas por el caso de uso de diseño, es decir, las condiciones de ejecución de las ramas verdaderas y falsas se cubren cada vez que se toma la decisión. De la definición, podemos ver que los ángulos de medición de prueba de los dos métodos son diferentes. En términos del método de cálculo, el denominador de la cobertura de la declaración es el número total de líneas de código y el denominador de la cobertura de sucursales es el número total de sucursales juzgadas en el código.

02

Ejemplo de prueba de cobertura de sucursales

Usemos el siguiente código simple como ejemplo:

8227.jpg

Este código tiene un total de 11 líneas, una condición de juicio lógico, es decir, x <10 es verdadero o falso, podemos ver que las variables de entrada a y b determinan el valor de salida y. Para el diseño de prueba de cobertura de sucursales de este código, establecemos a=5 o a=15, correspondientes a dos casos en los que x<10 es verdadero o falso. Cuando a = 5, x <10 es verdadero, el caso de prueba ejecuta las líneas 1 a 6 del código e ingresa a la rama lógica verdadera, cuando a = 15, x <10 es falso y el código ejecuta las líneas 1, 2 y 8 a 11, se ejecuta la rama cuya lógica es falsa. Estos dos casos de prueba cubren las dos ramas de decisión y la tasa de cobertura de la rama es del 100%.

En el código anterior, hemos diseñado dos casos de prueba para la cobertura de sucursales, alcanzando una tasa de cobertura del 100%. Podemos encontrar que los mismos dos diseños de prueba tienen una tasa de cobertura de declaraciones del 100%. La cobertura de declaraciones es la misma que la de la sucursal. Cómo reflejar la diferencia en la cobertura, el mismo código a menudo se escribe con los siguientes hábitos en la práctica, como:

8228.jpg

El efecto de este código es el mismo que el del código del ejemplo anterior, y es el mismo para el diseño de cobertura de rama, porque también hay solo una condición de juicio y es necesario probar los dos casos de rama donde x <10 es verdadero o falso, pero el diseño de cobertura de declaraciones El diseño de cobertura de declaraciones solo necesita diseñar un caso de uso, y establecer a = 5 puede cubrir todas las declaraciones de código. Aquí podemos ver que la cobertura de sucursales está más estructurada que la cobertura de extractos.

El ejemplo anterior es relativamente simple. Cambiemos ligeramente este código para explorar la cobertura de sucursales en profundidad. El código de muestra es el siguiente:

8229.png

Podemos ver que la lógica de este código se ha juzgado una vez y el código también tiene dos ramas. Para la prueba de cobertura de ramas, solo necesitamos verificar si x < 10 && y > 10 == 0 es verdadero o falso, es decir Es decir, podemos hacer que cuando a = 15 o b = 5, el código juzgue que ingresa la rama verdadera de la condición, y si a = 5 y b = 15, el código juzga que ingresa la rama de la condición falsa.

En el ejemplo anterior, también podemos ver que en la prueba de cobertura de rama, solo tomamos los casos verdadero y falso en la declaración de juicio general después de if, y no profundizamos en cada condición de juicio en la línea de declaración de código para obtener verdadero y falso.

03

Utilice herramientas para realizar pruebas de cobertura de sucursales

En este capítulo, continuamos usando la herramienta SmartRocket TestGrid para el análisis de prueba de cobertura de rama del código y presentamos cómo la herramienta genera casos de prueba para completar la tarea de prueba.

3.1  Ejemplos de prueba de herramientas

Para el siguiente código:

82210.png

En este código, podemos ver que la función tiene dos parámetros formales, a saber, lua_State *L e init idx, y la lógica del código es relativamente simple: cuando más sea verdadero, ejecute api_incr_top (L), y cuando sea falso, ejecute L ->arriba - = 1. more es una variable local definida en el bloque de código, a la que se le asigna el valor luaH_next(L, hvalue(t), L->top - 1).

Después del análisis automático, la herramienta generará un gráfico de flujo de control de la siguiente manera:

82211.png

El gráfico de flujo de control puede ver visualmente las dos ramas en este ejemplo. Podemos diseñar casos de prueba para establecer más como verdadero y falso para cubrir las dos ramas respectivamente, de modo que se pueda lograr una cobertura de rama del 100%.

Al observar el archivo de encabezado del proyecto, podemos ver que el parámetro formal hvalue(t) de la función luaH_next() se ha definido y se convierte en luaH_next (L, ((&((((union GCUnion *)((( (t)- >value_).gc))))->h))), L->top - 1), puede usar la herramienta para generar la función stub en el caso de prueba. La siguiente figura muestra el caso de prueba. 1 generado automáticamente por la herramienta:

82212.png

El valor de retorno de la función stub en este caso de prueba controla si la condición de juicio es verdadera o falsa. Este caso de prueba cubre la declaración de rama verdadera en el código. El valor de retorno final de la función en el código también está determinado por la variable más. También podemos ver que el valor de retorno real es el mismo que el valor de retorno de la función stub en la salida del caso de uso.

La siguiente figura muestra el caso de prueba 2:

82213.png

En este ejemplo, el valor de retorno de la función auxiliar luaH_next() se establece en 0, por lo que lo que se cubre es el código que juzga que el resultado es un código de rama de declaración falsa. Para los parámetros de entrada en el caso de uso, la función stub y la declaración de ejecución se ven afectadas durante el proceso de ejecución, lo que afecta indirectamente el valor de la condición de juicio en este ejemplo.

Podemos ver que la herramienta cubre las dos ramas de juicio a través de estos dos casos de prueba, por lo que la tasa de cobertura de la rama de prueba de este código es del 100%.

04

Resumen de la prueba

Tenemos las siguientes sugerencias para su referencia al realizar pruebas de cobertura de sucursales.

1. Generalmente, diferentes niveles de sil requieren diferentes métodos de cobertura estructural, pero la cobertura de declaraciones y la cobertura de ramas generalmente aparecen en los requisitos de prueba de niveles bajos de sil.

2. Las dimensiones estadísticas de cobertura de la cobertura de la declaración y la cobertura de la rama son diferentes: la cobertura de la declaración toma el número de líneas de código como denominador y la cobertura de la rama toma el número total de ramas juzgadas lógicamente en el código como denominador.

3. Los casos de prueba se pueden reutilizar cuando se combinan la cobertura del extracto y la cobertura de la sucursal. Podemos superponer casos de prueba sobre la base de la cobertura del extracto para completar la cobertura parcial de las sucursales no probadas.

Supongo que te gusta

Origin blog.csdn.net/TICPSH/article/details/132619348
Recomendado
Clasificación