¿Qué es la prueba de bucle? Metodología, ejemplo

⚡ Resumen inteligente

Las pruebas de bucle validan las estructuras de bucle dentro de un programa, comprobando qué sucede cuando se omite un bucle, se entra en él una sola vez, se ejecuta en su límite y se extiende una iteración más allá del número máximo permitido.

  • 🔘 Definición: Una técnica de estructura de control de caja blanca orientada a la validez de los bucles, no a las pantallas.
  • 🔁 Cuatro clases: Los bucles simples, anidados, concatenados y no estructurados requieren cada uno su propia estrategia.
  • 📍 Tres puntos de control: Entrada en el bucle, comportamiento durante la ejecución y condición de salida.
  • 🧪 pases de límite: Cero, uno, dos, un conteo típico, luego b-1, b y b+1 iteraciones.
  • 🪜 Orden anidada: Empiece por el bucle más interno, mantenga los bucles externos al mínimo y luego trabaje hacia afuera.
  • ???? Defectos encontrados: Límites de uno a uno, contadores no inicializados, bucles infinitos y cuellos de botella de capacidad.
  • ⚠️ Limitación: Los errores de bucle se encuentran en el código de bajo nivel y, una vez detectados, rara vez son sutiles.

Metodología de pruebas de bucle, tipos de bucles y ejemplos de casos de prueba

¿Qué es la prueba de bucle?

Prueba de bucle es un tipo de prueba de software que se centra completamente en la validez de las estructuras de bucle en un programa. Es una parte de las pruebas de estructura de control, junto con prueba de ruta, pruebas de validación de datos y pruebas de condiciones.

La prueba de bucle es una pruebas de caja blanca Se trata de una técnica que aplica alguien que puede leer el código fuente y ver la condición del bucle, el contador y la ruta de salida. El evaluador no adivina el comportamiento a partir de la interfaz de usuario; el bucle en sí es el objeto que se está probando.

El diagrama que aparece a continuación muestra la ubicación de las pruebas de bucle dentro de la familia de pruebas de la estructura de control.

Las pruebas de bucle se muestran como una rama de las pruebas de estructuras de control.

Tipos de bucle probados

Antes de elegir una estrategia, identifique cuál de las cuatro clases de bucles está considerando. Ejemplos de tipos de bucles probados son:

  • Bucle simple — un único bucle con una entrada y una salida, como un simple por la, mientras or hacer mientras construir.
  • Bucle anidado — un bucle colocado dentro de otro, de modo que el bucle interior se ejecuta hasta su finalización en cada pasada del bucle exterior.
  • Bucle concatenado — dos o más bucles que se ejecutan uno tras otro en secuencia.
  • Bucle no estructurado — una combinación no planificada de bucles anidados y concatenados, generalmente como resultado de saltos hacia dentro o hacia fuera del cuerpo de un bucle.

La clase determina el esfuerzo. Un bucle simple requiere unas pocas iteraciones; un bucle no estructurado generalmente requiere que se rediseñe el código antes de poder probarlo.

¿Por qué realizar pruebas de bucle?

Las pruebas de bucle se realizan por las siguientes razones

  • Las pruebas pueden solucionar los problemas de repetición del bucle
  • Las pruebas de bucle pueden revelar cuellos de botella en el rendimiento y la capacidad.
  • Al probar los bucles, se pueden determinar las variables no inicializadas en el bucle.
  • Ayuda a identificar problemas de inicialización de bucles.

También existe una razón comercial. Un bucle que se ejecuta una iteración de más corrompe el total; un bucle que nunca termina bloquea un proceso. Ambos defectos son fáciles de detectar mientras el código aún está en la máquina del desarrollador, pero costosos de encontrar en producción.

Cómo hacer pruebas de bucle: metodología completa

Al probar un bucle, este debe verificarse en tres niveles diferentes:

  • Cuando se entra en el bucle
  • Durante su ejecución, y
  • Cuando se deja el bucle

La estrategia de prueba para todos estos bucles es la siguiente.

Bucle simple

Un bucle simple tiene una única entrada y una única salida, como se muestra a continuación.

Diagrama de flujo de bucle simple con un punto de entrada y una condición de salida.

Un bucle simple se prueba de la siguiente manera:

  1. Saltar todo el bucle
  2. Realizar una pasada por el bucle.
  3. Haz 2 pasada por el bucle.
  4. Hacer a pasa por el bucle donde a < b, ese es un recuento típico de iteraciones de rango medio
  5. Hacer b, b-1 y b+1 pasa por el bucle donde b es el número máximo de pasadas permitidas a través del bucle.

Los dos últimos casos son los que aportan mayor valor. Saltarping El bucle demuestra que la condición de salida se evalúa antes de que se ejecute el cuerpo, y el bEl caso +1 demuestra que el bucle se niega a trabajar más allá de su límite declarado en lugar de desbordar un array.

Bucle anidado

Un bucle anidado multiplica el número de posibles combinaciones de iteración, por lo que se prueba de adentro hacia afuera en lugar de todo a la vez.

Diagrama de flujo de bucle anidado con un bucle interno encerrado por un bucle externo.

Para crear un bucle anidado, debes seguir los siguientes pasos.

  1. Establece todos los demás bucles a su valor mínimo y comienza en el bucle más interno.
  2. Para el bucle más interno, realice una prueba de bucle simple y mantenga los bucles externos en su valor mínimo de parámetro de iteración.
  3. Realiza la prueba para el siguiente bucle y trabaja hacia afuera.
  4. Continúe hasta que se haya probado el bucle más externo.

Bucles concatenados

Los bucles concatenados se sitúan uno tras otro en la misma ruta de ejecución, como muestra el diagrama.

Diagrama de flujo de bucles concatenados que muestra dos bucles ejecutándose en secuencia.

En los bucles concatenados, si dos bucles son independientes entre sí, se prueban utilizando el método de bucle simple; de ​​lo contrario, se prueban como bucles anidados.

Sin embargo, si el contador de un bucle se utiliza como valor inicial para el otro, los dos bucles no se consideran independientes.

Bucles no estructurados

Los bucles no estructurados son el caso más difícil, porque el control entra y sale del cuerpo del bucle en puntos arbitrarios.

Diagrama de flujo de bucle no estructurado con salto de controlping dentro y fuera del circuito del cuerpo

Para bucles no estructurados, el diseño debe reestructurarse para reflejar el uso de construcciones de programación estructurada. Una vez que el código se ha reducido a formas simples, anidadas o concatenadas, se aplica la estrategia de correspondencia descrita anteriormente.

Ejemplo de prueba de bucle con casos de prueba

Un ejemplo resuelto hace que el conteo de iteraciones sea concreto. Consideremos una rutina que multiplica un resultado acumulado por cada número entero del 1 al 100. n, un cálculo factorial. El contador del bucle comienza en 1, la condición de salida es mostrador > ny el bucle está declarado para aceptar un máximo de 12 iteraciones antes de que el resultado desborde el tipo entero declarado.

Si se trata como un bucle simple, el número de iteraciones recomendado anteriormente se traduce en lo siguiente: Casos de prueba.

Caso de prueba Valor de n Pases ejecutados Lo que demuestra
TC01 0 0 (bucle omitido) La condición de salida se evalúa antes de que se ejecute el cuerpo, y el resultado se mantiene en su valor inicial de 1.
TC02 1 1 Una sola pasada produce el resultado correcto y el contador se incrementa una vez.
TC03 2 2 El acumulador transfiere un valor entre dos pasadas consecutivas.
TC04 5 5 Un recuento típico de rango medio arroja el resultado esperado de 120, lo que confirma un comportamiento normal.
TC05 11 11 Una pasada por debajo del máximo aún se completa normalmente (b-1).
TC06 12 12 Se acepta el máximo declarado y el bucle finaliza (b).
TC07 13 rechazada Se rechaza un paso más allá del máximo en lugar de desbordarse silenciosamente (b+ 1).

Observe que TC01 y TC07 son los dos casos que los desarrolladores suelen omitir, y son los dos que exponen defectos de inicialización omitida y desbordamiento. Un valor negativo de n pertenece al mismo conjunto si la especificación permite que se proporcione, lo que vincula las pruebas de bucle con prueba negativa.

Defectos comunes detectados mediante pruebas de bucle

Las pruebas de bucle siguen encontrando la misma pequeña familia de fallos, lo que hace que valga la pena ejecutar el recuento fijo de iteraciones cada vez.

  • Límites desviados por uno — una condición escrita como < dónde <= era lo previsto, por lo que el bucle realiza una pasada menos o una pasada más.
  • Contadores o acumuladores no inicializados — un total que incluye un valor sobrante de una llamada anterior.
  • Bucles infinitos — una condición de salida que el cuerpo del bucle nunca puede satisfacer porque el contador se actualiza solo en algunas ramas.
  • Supuestos de bucle omitido — código después del bucle que lee una variable que se esperaba que el cuerpo del bucle estableciera, lo cual falla cuando el bucle se ejecuta cero veces.
  • Fallos de capacidad y rendimiento — un bucle que es correcto pero que vuelve a leer la base de datos en cada pasada, por lo que el coste aumenta con el número de iteraciones.
  • Interferencia de bucle anidado — un bucle interno que reutiliza el contador del bucle externo y cambia silenciosamente el contador de iteraciones externo.

Debido a que cada falla se corresponde con un número de iteraciones específico, los defectos que aparecen aquí son fáciles de reproducir y rápidos de corregir en comparación con los defectos encontrados en iteraciones más altas. niveles de prueba.

Pruebas de bucle frente a otras técnicas de prueba de estructuras de control

Las pruebas de bucle pertenecen a la familia de estructuras de control y es fácil confundirlas con técnicas afines. La siguiente tabla las diferencia.

Tecnologia A qué apunta Objetivo de cobertura típico
Prueba de bucle Estructuras del bucle: entrada, número de iteraciones y salida. Recuentos de iteraciones cero, uno, típico y límite para cada bucle.
Prueba de condición Expresiones booleanas dentro de las decisiones Cada condición evaluaba tanto lo verdadero como lo falso.
Pruebas de flujo de datos Definición y uso de cada variable Cada par definición-uso ejercitado al menos una vez
Pruebas de ruta base Rutas independientes a través del grafo de flujo de control Un número de caminos igual a la complejidad ciclomática

En la práctica, estas técnicas son complementarias en lugar de competir entre sí. Complejidad ciclomática Te indica cuántas rutas independientes existen, la prueba de ruta base las cubre y la prueba de bucle luego agrega los recuentos de iteración que la cobertura de ruta por sí sola no forzaría. Todas ellas son pruebas dinámicas actividades, ya que el código debe ejecutarse para que se observen los resultados.

Limitación en las pruebas de bucle

Esta técnica tiene límites reales, y conocerlos evita la sobreinversión.

  • Los errores de bucle aparecen principalmente en software de bajo nivel
  • Los errores identificados durante las pruebas de bucle no son muy sutiles
  • Muchos de los errores podrían ser detectados por el sistema operativo, ya que provocan violaciones de límites de memoria, errores de puntero detectables y fallos similares.
  • Identificar la clase de cada bucle y probarla en consecuencia consume tiempo, lo cual es difícil de justificar en rutas de código que conllevan poco riesgo.

Preguntas Frecuentes

Desarrolladores y probadores técnicos con acceso al código fuente, generalmente durante examen de la unidad o revisión de código. Los evaluadores de negocio no pueden aplicarlo, porque la condición del bucle es invisible desde la interfaz de usuario.

El modelo lee la condición del bucle y propone automáticamente los recuentos de iteraciones cero, uno, típicos y límite, incluyendo el caso de desbordamiento. Un revisor confirma que cada resultado esperado coincide con la especificación.

El sistema los genera rápidamente, ya que el patrón de iteración es formulado. Los asistentes automatizados también pueden ejecutar el conjunto de pruebas e informar qué recuentos fallan, pero la decisión sobre el número máximo de pases permitidos sigue siendo una decisión de diseño que corresponde a un humano.

Ejecuta el caso con un tiempo de espera o una protección de iteración para que la prueba falle rápidamente en lugar de bloquear la suite. Verifica el número de pasadas registradas, no solo el valor de salida final.

Mucho menos que cualquier combinación. Probar de adentro hacia afuera mantiene el conteo aproximadamente aditivo entre niveles en lugar de multiplicativo, porque los bucles externos se fijan en su valor mínimo mientras se ejercita el bucle interno.

No existe ninguna herramienta dedicada a ello. Los equipos combinan un marco de pruebas unitarias como JUnit o bien, utilice pytest con una herramienta de cobertura que informe sobre la cobertura de las ramas y, a continuación, lea el informe para confirmar que se alcanzó la ruta de iteración cero.

No. La cobertura de ramas se satisface una vez que se entra y se sale de un bucle al menos una vez. La prueba de bucles requiere además el recuento de pasadas omitidas y de límites, algo que la cobertura de ramas por sí sola nunca exige.

Siempre que no esté estructurado, control saltaping dentro o fuera del cuerpo. Reestructurar en formas simples, anidadas o concatenadas cuesta menos que diseñar pruebas para cada punto de entrada irregular.

Resumir este post con: