La partición de equivalencia o partición de clases de equivalencia ( ECP ) [1] es una técnica de prueba de software que divide los datos de entrada de una unidad de software en particiones de datos equivalentes de las cuales se pueden derivar casos de prueba. En principio, los casos de prueba están diseñados para cubrir cada partición al menos una vez. Esta técnica intenta definir casos de prueba que descubran clases de errores, reduciendo así el número total de casos de prueba que deben desarrollarse. Una ventaja de este enfoque es la reducción del tiempo necesario para probar el software debido a un menor número de casos de prueba.
La partición de equivalencia se aplica normalmente a las entradas de un componente probado, pero puede aplicarse a las salidas en casos excepcionales. Las particiones de equivalencia suelen derivarse de la especificación de requisitos para los atributos de entrada que influyen en el procesamiento del objeto de prueba.
El concepto fundamental de ECP proviene de la clase de equivalencia , que a su vez proviene de la relación de equivalencia . Un sistema de software es en efecto una función computable implementada como un algoritmo en algún lenguaje de programación de implementación . Dado un vector de prueba de entrada , algunas instrucciones de ese algoritmo quedan cubiertas (consulte la cobertura del código para obtener más detalles), otras no. Esto da la interesante relación entre los vectores de prueba de entrada: es una relación de equivalencia entre los vectores de prueba a, b si y solo si la huella de cobertura de los vectores a, b es exactamente la misma, es decir, cubren las mismas instrucciones, en el mismo paso. Esto significaría evidentemente que la relación de cobertura C dividiría el dominio del vector de prueba en múltiples clases de equivalencia . Esta partición se llama partición de clase de equivalencia de la entrada de prueba. Si hay N clases equivalentes, solo N vectores son suficientes para cubrir completamente el sistema.
La demostración se puede realizar utilizando una función escrita en C :
int safe_add ( int a , int b ) { int c = a + b ; si ( a > 0 && b > 0 && c <= 0 ) { fprintf ( stderr , "Desbordamiento (positivo)! \n " ); } si ( a < 0 && b < 0 && c >= 0 ) { fprintf ( stderr , "Desbordamiento (negativo)! \n " ); } devolver c ; }
En base al código, los vectores de entrada de [ a , b ] están particionados. Los bloques que necesitamos cubrir son el desbordamiento en dirección positiva, dirección negativa y ninguno de estos 2. Esto da lugar a 3 clases equivalentes, a partir de la propia revisión del código.
Para resolver el problema de entrada, nos refugiamos en la inecuación
Observamos que hay un tamaño fijo de entero (informática) , por lo tanto, la z se puede reemplazar con:
y
con x ∈ { INT_MIN , ... , INT_MAX } e y ∈ { INT_MIN , ... , INT_MAX }
Los valores del vector de prueba en la condición estricta de igualdad, es decir, INT_MIN = x + y e INT_MAX = x + y, se denominan valores límite. El análisis de valores límite contiene información detallada al respecto. Tenga en cuenta que el gráfico solo cubre el caso de desbordamiento, el primer cuadrante para los valores positivos de X e Y.
En general, una entrada tiene ciertos rangos que son válidos y otros rangos que no lo son. Los datos no válidos no significan que sean incorrectos, sino que se encuentran fuera de una partición específica. Esto se puede explicar mejor con el ejemplo de una función que toma un parámetro "mes". El rango válido para el mes es de 1 a 12, que representa de enero a diciembre. Este rango válido se denomina partición. En este ejemplo, hay dos particiones más de rangos no válidos. La primera partición no válida sería ≤ 0 y la segunda partición no válida sería ≥ 13.
... -2 -1 0 1 ................ 12 13 14 15 ..... --------------|-------------------|------------------------ ------ partición 1 no válida partición válida partición 2 no válida
La teoría de pruebas relacionada con la partición de equivalencia dice que solo se necesita un caso de prueba de cada partición para evaluar el comportamiento del programa para la partición relacionada. En otras palabras, es suficiente seleccionar un caso de prueba de cada partición para verificar el comportamiento del programa. Usar más o incluso todos los casos de prueba de una partición no encontrará nuevos fallos en el programa. Los valores dentro de una partición se consideran "equivalentes". Por lo tanto, el número de casos de prueba se puede reducir considerablemente.
Un efecto adicional de la aplicación de esta técnica es que también se encuentran los denominados casos de prueba "sucios". Un evaluador inexperto puede verse tentado a utilizar como casos de prueba los datos de entrada del 1 al 12 del mes y olvidarse de seleccionar algunas de las particiones no válidas. Esto daría lugar a una gran cantidad de casos de prueba innecesarios por un lado y a una falta de casos de prueba para los rangos sucios por el otro.
La tendencia es relacionar la partición de equivalencia con las llamadas pruebas de caja negra , que consisten estrictamente en comprobar un componente de software en su interfaz, sin tener en cuenta las estructuras internas del software. Pero si analizamos el tema con más detenimiento, hay casos en los que también se aplica a las pruebas de caja gris . Imaginemos una interfaz con un componente que tiene un rango válido entre 1 y 12, como en el ejemplo anterior. Sin embargo, internamente, la función puede tener una diferenciación de valores entre 1 y 6 y de valores entre 7 y 12. Según el valor de entrada, el software internamente se ejecutará por diferentes caminos para realizar acciones ligeramente diferentes. En lo que respecta a las interfaces de entrada y salida del componente, esta diferencia no se notará; sin embargo, en las pruebas de caja gris, le gustaría asegurarse de que se examinen ambos caminos. Para lograrlo, es necesario introducir particiones de equivalencia adicionales que no serían necesarias para las pruebas de caja negra. Para este ejemplo, esto sería:
... -2 -1 0 1 ..... 6 7 ..... 12 13 14 15 ..... --------------|---------|----------|-------------- ------- partición inválida 1 P1 P2 partición inválida 2 particiones validas
Para comprobar los resultados esperados, deberá evaluar algunos valores intermedios internos en lugar de la interfaz de salida. No es necesario que usemos varios valores de cada partición. En el escenario anterior, podemos tomar -2 de la partición no válida 1, 6 de la partición válida P1, 7 de la partición válida P2 y 15 de la partición no válida 2.
La partición de equivalencia no es un método independiente para determinar los casos de prueba. Debe complementarse con un análisis de valores límite . Una vez determinadas las particiones de las posibles entradas, se debe aplicar el método de análisis de valores límite para seleccionar los casos de prueba más eficaces entre estas particiones.
En los casos en los que los rangos o conjuntos de datos involucrados se acercan a la simplicidad (ejemplo: 0-10, 11-20, 21-30), y la prueba de todos los valores sería práctica, se debe considerar la cobertura de prueba general utilizando todos los valores dentro y alrededor de los rangos. La cobertura de prueba general puede revelar errores que no se detectarían utilizando el método de partición de equivalencia, si el software incluye subparticiones que son desconocidas para el evaluador. [2] Además, en casos simplistas, el beneficio de reducir la cantidad de valores de prueba mediante la partición de equivalencia se reduce, en comparación con los casos que involucran rangos más grandes (ejemplo: 0-1000, 1001-2000, 2001-3000).