code coverage tutorial
Este tutorial completo explica qué es la cobertura de código en las pruebas de software, sus tipos, beneficios y desventajas:
El objetivo final de cualquier empresa de desarrollo de software es desarrollar software de buena calidad. Para lograr este objetivo, el software debe probarse a fondo.
Las pruebas son, por tanto, una parte integral del desarrollo de una aplicación de software. Por lo tanto, es esencial que el desarrollador revise el software desarrollado (lo que se realiza durante la fase de prueba de la unidad) y luego se transmite al equipo de control de calidad para que lo pruebe a fondo para garantizar que tenga un mínimo o ningún error.
El software se prueba unitariamente antes de ser lanzado al equipo de prueba real para su prueba. Como esta prueba implica probar a nivel de código, la realiza el desarrollador. Esto se hace para garantizar que cada parte del código que se está probando funcione como se espera.
Aquí, pequeños fragmentos de código que se han desarrollado se prueban de forma aislada para garantizar su corrección. Pero, la pregunta que a menudo surge en la mente de un desarrollador es la cantidad de pruebas unitarias que se deben realizar y la respuesta a esto se encuentra en la Cobertura del Código.
Este tutorial le brindará un conocimiento profundo de qué es la Cobertura de Código y por qué la necesitamos. Llegará a saber en qué se diferencia de la cobertura de prueba.
También echaremos un vistazo a las herramientas y metodologías que se utilizan para la cobertura de código y hacia el final de este tutorial, veremos los beneficios junto con sus inconvenientes. Algunos de los mitos asociados con la cobertura del código también se tratarán aquí.
Lo que vas a aprender:
¿Qué es la cobertura del código?
Esta es una métrica de prueba unitaria importante. Resulta útil para conocer la eficacia de las pruebas unitarias. Es una medida que indica qué porcentaje de código fuente se ejecutaría durante la prueba.
En lenguaje sencillo, la medida en que el código fuente de un programa de software o una aplicación se ejecutará durante la prueba es lo que se denomina Cobertura de código.
Si las pruebas ejecutan todo el código, incluidas todas las ramas, condiciones o bucles, diríamos que hay una cobertura completa de todos los escenarios posibles y, por lo tanto, la cobertura del código es del 100%. Para entender esto aún mejor, tomemos un ejemplo.
A continuación se muestra un código simple que se utiliza para sumar dos números y mostrar el resultado según el valor del resultado.
|_+_|El programa anterior tiene dos entradas, es decir, 'a' y 'b'. La suma de ambos se almacena en la variable c. Si el valor de c es menor que 10, entonces se imprime el valor de 'c'; de lo contrario, se imprime 'Lo siento'.
Ahora, si tenemos algunas pruebas para validar el programa anterior con los valores de a & b de manera que la suma sea siempre menor que 10, entonces la parte else del código nunca se ejecuta. En tal escenario, diríamos que la cobertura no está completa.
Este fue solo un pequeño ejemplo para aclarar el significado de Cobertura del Código. A medida que exploremos más, obtendrá una mayor claridad al respecto.
Por qué necesitamos cobertura de código
(imagen fuente )
Varias razones hacen que la Cobertura de código sea esencial y algunas de ellas se enumeran a continuación:
cómo ejecutar el archivo jar de Java
- Ayuda a determinar que el software tiene errores menores en comparación con el software que no tiene una buena cobertura de código.
- Al ayudar a mejorar la calidad del código, indirectamente ayuda a entregar un software de mejor 'calidad'.
- Es una medida que se puede utilizar para conocer la efectividad de la prueba (efectividad de las pruebas unitarias que se escriben para probar el código).
- Ayuda a identificar aquellas partes del código fuente que no se probarían.
- Ayuda a determinar si las pruebas actuales (pruebas unitarias) son suficientes o no y si también se necesitan más pruebas.
Cobertura de código versus cobertura de prueba
Para comprender la diferencia entre Cobertura de código y Cobertura de prueba, primero comprendamos el significado de Cobertura de prueba.
Cobertura de prueba
Es una medida de cuántas partes de las pruebas esperadas se han cubierto durante la prueba de un software. Por 'Pruebas esperadas' nos referimos al conjunto completo de casos de prueba que están escritos para ser ejecutados para probar un software dado.
Supongamos que para probar un software se ha escrito un conjunto de 500 casos de prueba en total. Ahora, como parte de la actividad de prueba, solo se ejecutaron 300 casos de prueba. Supongamos que esto se debe a la falta de tiempo. En este caso, la siguiente sería la cobertura de la prueba.
Cobertura de prueba = (casos de prueba ejecutados / casos de prueba totales) * 100
= (300/500) * 100
= 60 %
Comparemos esto con lo que es la cobertura del código.
Cobertura de código
Es una medida que muestra hasta qué punto se ejecuta el código fuente de una aplicación durante la prueba del código. Por lo tanto, muestra el grado en que se probaría un código fuente.
Supongamos que para probar una aplicación con 500 líneas de código, solo 400 líneas del código se ejecutan mediante pruebas. Supongamos que esto se debe a que cierto bucle / condición no se ejecuta. En este caso, lo siguiente sería la cobertura del código.
Cobertura de código = (número de líneas de código ejecutadas / número total de líneas de código) * 100
= (400/500) * 100
= 80 %
A continuación se enumeran las diferencias entre la cobertura del código y la cobertura de la prueba:
Cobertura de prueba | Cobertura de código |
---|---|
Es una medida de qué parte de las pruebas esperadas se han cubierto durante la prueba de un software. | Es una medida que muestra hasta qué punto se ejecuta el código fuente de una aplicación durante la prueba del código. |
La cobertura de la prueba se puede calcular utilizando la siguiente fórmula: Cobertura de prueba = (casos de prueba ejecutados / casos de prueba totales) * 100 | La cobertura del código se puede calcular utilizando la siguiente fórmula: Cobertura de código = (número de líneas de código ejecutadas / número total de líneas de código) * 100 |
Metodologias
Aquí, discutiremos los diversos métodos que se pueden usar para medir la Cobertura del Código.
Para comprender estas metodologías, echemos un vistazo al siguiente fragmento de código:
|_+_|Cobertura de estados de cuenta
Esta metodología es una medida que indica si todas las posibles declaraciones de código ejecutables en el código fuente se han ejecutado al menos una vez. Es un método para garantizar que cada línea del código fuente esté cubierta al menos una vez por las pruebas.
Esto puede parecer simple, pero se debe tener precaución al medir la cobertura de la declaración. La razón es que, en un código fuente, podría haber una cierta condición que podría no ejecutarse dependiendo de los valores de entrada.
Esto significaría que no se cubrirían todas las líneas de código en las pruebas. Por lo tanto, es posible que tengamos que usar diferentes conjuntos de valores de entrada para cubrir todas estas condiciones en el código fuente.
Por ejemplo, en el código fuente anterior, si los valores de entrada se toman como 2 y 3, la parte 'Else' del código no se ejecutará. Sin embargo, si los valores de entrada son de tipo 3 y 2, la parte 'Si' del código no se ejecutará.
Esto significa que con cualquiera de los conjuntos de valores de nuestra cobertura de declaración no sería del 100%. En tal caso, es posible que tengamos que ejecutar las pruebas con los tres ((2, 3), (3, 2), (0, 0)) conjuntos de valores para garantizar una cobertura del estado de cuenta del 100%.
Cobertura de funciones
Como sugiere el nombre, esta metodología mide el grado en que las funciones presentes en el código fuente están cubiertas durante las pruebas. Todas las funciones que están en el código fuente se prueban durante la ejecución de la prueba. Nuevamente, debe asegurarse de que probamos estas funciones para valores variables para que la función se pruebe a fondo.
En un código fuente puede haber múltiples funciones y, dependiendo de los valores de entrada utilizados, se puede llamar o no a una función. Por lo tanto, el propósito de la Cobertura de funciones es garantizar que tengamos cada función solicitada.
Por ejemplo, en el código fuente anterior, si nuestras pruebas llaman a la función 'Agregar' aunque sea una vez, lo llamaríamos Cobertura de función completa.
Cobertura de condición
En un código fuente, siempre que tengamos una condición, el resultado sería un valor booleano de verdadero o falso. La cobertura de condición tiene como objetivo establecer si las pruebas cubren ambos valores, es decir, verdadero o falso.
En el código fuente, cuando cada condición que ocurre se evalúa tanto para estados verdaderos como falsos, entonces se dice que la cobertura de condición para el código está completa.
Por ejemplo, en el código anterior, si se utilizan los conjuntos de valores (2, 3) y (4, 2), la cobertura de condición sería del 100%. Cuando se usa el conjunto de datos (2, 3), entonces (b> a) se evalúa como verdadero y (a> b) se evalúa como falso. De manera similar, cuando se usa el conjunto de datos (4, 2), entonces (b> a) se evalúa como falso y (a> b) se evalúa como verdadero.
Por lo tanto, ambas condiciones tienen ambos valores, es decir, verdadero y falso cubiertos. Por lo tanto, la Cobertura de la condición sería del 100%.
herramientas que necesita para el desarrollo web
Cobertura de sucursales
Esta metodología tiene como objetivo garantizar que todas las ramas que aparecen en cada estructura condicional se ejecuten en el código fuente. Por ejemplo, en el código anterior, todas las declaraciones 'Si' y cualquier declaración 'Else' que las acompañe deben estar cubiertas por la prueba para una cobertura de sucursal del 100%.
Por ejemplo, en el código anterior, si se utilizan los conjuntos de valores (2, 3), (4, 2), (1, 1), la cobertura de la sucursal sería del 100%. Cuando se usa el conjunto de datos (2, 3), entonces (b> a) y se ejecuta la primera rama 'Si'. De manera similar, cuando se usa el conjunto de datos (4, 2), entonces (a> b) se evalúa como verdadero y se ejecuta la segunda rama 'Si'.
Luego, con el conjunto de datos (1, 1), la rama 'Else' se evalúa como verdadera y se ejecuta. De esta manera, garantizamos una cobertura de sucursales del 100%.
Cobertura de sucursales versus cobertura de condición
La cobertura de sucursal a menudo se confunde con la cobertura de condición, sin embargo, las dos son diferentes.
Entendamos esto con un ejemplo simple.
|_+_|Anotemos el conjunto de datos necesarios para completar Cobertura de sucursales:
(1, 1): en este caso, 'a' y 'b' son verdaderas, por lo que se ejecuta la condición If.
(1, 0) - En este caso, 'a' es verdadero y 'b' sería falso, por lo que se ejecuta la parte Else del código.
Como sabemos, el propósito de la cobertura de sucursales es lograr que todas las sucursales se ejecuten al menos una vez y este propósito se logra.
Cobertura de condición:
(1, 0) - En este caso, 'a' es verdadero y 'b' sería falso.
(0, 1) - En este caso, 'a' es falso y 'b' sería verdadero.
El propósito de la Cobertura de condiciones es lograr que cada condición sea verdadera y falsa para cada condición ejecutada y este propósito se logra aquí.
¿Notó que la otra parte no se ejecuta en la cobertura de condiciones? Aquí es donde la cobertura por condiciones difiere de la cobertura de la sucursal.
Herramientas para la cobertura del código
Para medir la Cobertura de Código de cualquier Software, existen varias herramientas disponibles en el mercado.
A continuación se enumeran algunas de las herramientas para su referencia:
- Parasoft JTest
- Testwell CTC ++
- Cobertura
- JaCoCo
- CodeCover
- BullseyeCoverage
- EMMA
- OpenCover
- NCover
- Squish COCO
- CoberturaMeter
- GCT
- TCAT C / C ++
- Gretel
- JCov
Lectura recomendada => Herramientas de cobertura de código
El enlace anterior incluirá la siguiente información sobre estas herramientas:
- Características clave
- Tipo de licencia
- URL oficial
- Pros y contras
- Ultima versión
Beneficios
Como se vio anteriormente, es una métrica de prueba muy útil por las siguientes razones:
- Ayuda a identificar aquellas áreas en un código fuente que permanecerían sin probar / descubiertas por las pruebas.
- Es útil para identificar el código usado / muerto, mejorando así la calidad del código.
- La eficacia de las pruebas unitarias se puede conocer con la ayuda de Cobertura de código.
- El software de mejor calidad se puede entregar utilizando estas métricas.
Inconvenientes
- Tratar de apuntar a una cobertura de código del 100% a veces causa una falta de robustez de las pruebas, lo que resulta en perder la captura de escenarios propensos a defectos.
- A diferencia de la percepción común, no puede garantizar que el software diseñado satisfaga todos los requisitos.
Mitos Vs Hechos
Mito | Hecho |
---|---|
Tener una cobertura de código del 100% garantiza que el software no tenga errores. | No, la cobertura del código al 100% no puede garantizar un software libre de errores. Una buena cobertura de código, junto con los buenos esfuerzos del equipo de control de calidad, pueden garantizar un software con errores mínimos o nulos. |
Tener una cobertura de código del 100% significa que el código escrito es perfecto. | No, de hecho, si los requisitos importantes no han sido capturados por el código en primer lugar, entonces el código no se puede calificar como perfecto a pesar de que la Cobertura del Código sea del 100%. |
La cobertura de código mide la eficacia de las pruebas realizadas en un producto de software. | No, la Cobertura de código es solo una medida que se utiliza para probar la efectividad de las pruebas unitarias, es decir, las pruebas ejecutadas en el código fuente de un Software únicamente. |
Preguntas frecuentes
P # 1) ¿Qué es una cobertura de código aceptable?
Responder: Lograr una cobertura de código del 100% no debería ser el objetivo durante la prueba unitaria del código del software. ¿Pero por qué no? Para comprender la razón, es posible que deba profundizar un poco más para comprender el significado subyacente.
Cuando apuntamos a una cobertura del 100%, ocurre con mayor frecuencia que todo el enfoque en el diseño de las pruebas se centra en garantizar si se prueba cada declaración, bucle, rama o condición. Así que aterrizamos poniendo demasiados esfuerzos que quizás no valgan la pena considerando el tiempo invertido.
Además, centrarse en una cobertura alta también da como resultado que se pierdan los escenarios importantes que probablemente tengan los defectos porque todo lo que pretendemos es asegurarnos de que cada línea de código sea probada.
Centrarse en una alta cobertura de código no es siempre tan importante y tampoco puede ser un número fijo al que apuntar para probar diferentes códigos. Sin embargo, en general, una cobertura del 75% al 80% debería ser un número ideal.
Al probar nuestro código, el enfoque principal debe estar en asegurarse de cubrir los escenarios críticos y probables propensos a errores. Si estos se pasan por alto, a pesar de tener una Cobertura de Código del 100%, nuestras pruebas simplemente tendrían poca efectividad.
Q #2) ¿Cómo verifico la cobertura de mi código?
Responder: Para probar el porcentaje de Cobertura de Código que podría haber logrado con las pruebas diseñadas para probar el código, tenemos varias herramientas en el mercado. Dependiendo del lenguaje de programación que se esté usando, tenemos varias herramientas.
Algunos de ellos se enumeran a continuación:
- Java – Cobertura, JaCoCo
- Javascript - Blanket.js, Estambul
- Pitón – Coverage.py
- Rubí – SimpleCov
Con estas herramientas podemos obtener un informe de cobertura completo de nuestras pruebas que nos ayuda a saber qué parte del código se ejecutará y cuál se perderá en nuestras pruebas.
Q #3) ¿Es la cobertura de código una buena métrica?
Responder: En escenarios de la vida real, esto es útil hasta cierto punto y de algunas formas particulares.
Mirando primero sus limitaciones, sabemos muy bien que tener una cobertura del 100% no garantiza que el Código esté libre de errores, ni tampoco garantiza que todos los requisitos hayan sido cubiertos en el código, es decir, a pesar de una Cobertura del Código del 100%, estamos Es muy probable que haya errores en el código, debido a que la cobertura no garantiza que se hayan probado todos los escenarios.
Además, si los requisitos se han omitido al escribir el código, entonces no existe un mapeo de requisitos con el código que se atiende como parte de la Cobertura del Código.
Dicho esto, no podemos negar que cuando usamos Cobertura de Código como métricas, nos da una idea de si hemos cubierto los requisitos básicos de probar cada línea de nuestro código. Este porcentaje de cobertura nos da una idea de cuántas partes de nuestro código se están ejecutando con nuestras pruebas unitarias.
Llegamos a saber qué parte de nuestro código no se ejecutará. Esto, a su vez, nos ayuda a decidir cuántas más pruebas unitarias se necesitan y para qué partes del código.
Por tanto, podemos concluir que tener una cobertura deficiente nos da una idea de la ineficacia de las pruebas unitarias. Al mismo tiempo, asegurar una cobertura del 100% no es garantía de un código libre de defectos. Por lo tanto, es necesario tener un enfoque equilibrado en el que no exageremos la importancia de apuntar a un alto porcentaje de cobertura del código.
Q #4) ¿Cómo puedo mejorar la cobertura de mi código?
Responder: El Informe de cobertura del código que proporcionan las herramientas de cobertura como JaCoCo, Estambul, etc. muestra las áreas que están cubiertas por las pruebas y también las que no se probarían.
Al conocer las partes no probadas del código, las pruebas se pueden escribir manualmente o utilizando cualquier herramienta de automatización para cubrir las áreas que de otro modo no se probarían y, por lo tanto, aumentarían la Cobertura del Código.
Una cosa importante a tener en cuenta aquí es que, si bien podemos escribir cientos de líneas de código para probar una función en el código, la cobertura podría ser muy inferior. La razón es que profundizar demasiado para probar una parte del enorme código no ayudará a aumentar la cobertura del código.
Por lo tanto, si el objetivo es aumentar la cobertura, se debe tener cuidado de cubrir todas las funciones, condiciones y bucles en lugar de sumergirse profundamente en una sola función y escribir pruebas grandes para esa única función.
Conclusión
Un producto de software de alta calidad es lo que se requiere en el acelerado mundo actual de Internet.
preguntas de la entrevista principal de Java para experimentados
Asegurar un software de buena calidad no es solo responsabilidad de un ingeniero de control de calidad, sino que también es responsabilidad del desarrollador. Por lo tanto, la cobertura de código es de gran utilidad cuando se trata de entregar un producto de calidad al equipo de control de calidad por parte de los desarrolladores.
Este tutorial explica todo sobre la cobertura del código y sus usos. También profundizamos un poco más en la comprensión de la diferencia entre Cobertura de código y Cobertura de prueba. Además de esto, obtuvimos una comprensión de las metodologías utilizadas junto con una variedad de herramientas de cobertura de código.
Los beneficios e inconvenientes se informaron aquí. Finalmente, destruimos algunos de los mitos y preguntas frecuentes asociados con la cobertura de código
¡¡Feliz lectura!!
Lectura recomendada
- Las 15 mejores herramientas de cobertura de código (para Java, JavaScript, C ++, C #, PHP)
- Las 15 mejores herramientas JAVA para desarrollo, compilación, generación de perfiles, cobertura de código y revisión
- Tutorial de métodos / funciones de C # con ejemplos de código
- Tutorial de manejo de excepciones de C # con ejemplos de código
- Tutorial de Tortoise SVN: Revisiones en el repositorio de código
- Tutorial de longitud de matriz de Java con ejemplos de código
- Tutorial de AWS CodeBuild: extracción de código de la compilación de Maven
- Tutorial de SVN: Gestión de código fuente con Subversion