Pregunta

Fondo

Tengo una aplicación escrita en C ++ nativo en el transcurso de varios años que ronda los 60 KLOC. Hay muchas funciones y clases que están inactivas (probablemente del 10 al 15% como la pregunta similar basada en Unix a continuación). Recientemente comenzamos a hacer pruebas unitarias en todo el código nuevo y aplicarlo al código modificado siempre que sea posible. Sin embargo, haría un SWAG que tenga menos del 5% de cobertura de prueba en este momento.

Suposiciones / restricciones

El método y / o las herramientas deben admitir:

  • C ++ nativo (es decir, no administrado)
  • Windows XP
  • Visual Studio 2005
  • No debe requerir casos de prueba proporcionados por el usuario para la cobertura. (por ejemplo, no puede depender de pruebas unitarias para generar cobertura de código)

Si los métodos admiten más que estos requisitos, entonces genial.

NOTA: actualmente utilizamos la edición Professional de Visual Studio 2005, no el Team Team. Por lo tanto, usar Team System puede ser una sugerencia válida (no lo sé, nunca lo he usado), sin embargo, espero que no sea la solución only .

Por qué es problemático usar pruebas unitarias para la cobertura de código

Creo que es imposible para una herramienta genérica encontrar todos los muertos (por ejemplo, código inalcanzable) en cualquier aplicación arbitraria con cero falsos positivos (creo que esto sería equivalente al problema de detención). Sin embargo, también creo que es posible que una herramienta genérica encuentre muchos tipos de código muerto que son altamente probables de hecho, como clases o funciones que nunca son referenciadas en el código por nada más.

Al usar las pruebas unitarias para proporcionar esta cobertura, ya no usa un algoritmo genérico y, por lo tanto, aumenta el porcentaje de código muerto que puede detectar y la probabilidad de que los resultados no sean falsos positivos. Por el contrario, el uso de pruebas unitarias podría dar lugar a falsos negativos, ya que las pruebas unitarias en sí mismas podrían ser lo único que ejerza una determinada pieza de código. Idealmente, tendría pruebas de regresión que ejercitaran todos los métodos disponibles externamente, API, controles de usuario, etc. que servirían como una medida de referencia del análisis de cobertura de código para descartar que ciertos métodos sean falsos positivos. Lamentablemente, no tengo esta prueba automatizada en este momento.

Sin embargo, dado que tengo una base de código tan grande con un porcentaje tan bajo de cobertura de casos de prueba, estoy buscando algo que pueda ayudar sin requerir una gran cantidad de tiempo invertido en escribir casos de prueba.

Pregunta

¿Cómo se detecta el código muerto de forma automatizada o semiautomática en una aplicación nativa de C ++ en la plataforma Windows con el entorno de desarrollo Visual Studio 2005?

Ver también

Detección de código muerto en proyecto C / C ++ heredado Quiero decirle al Compilador VC ++ para compilar todo el código. ¿Se puede hacer?

¿Fue útil?

Solución

Solicite al vinculador que elimine los objetos sin referencia (/ OPT: REF). Si utiliza la vinculación a nivel de función y la salida detallada del vinculador, la salida del vinculador enumerará todas las funciones que pueda probar que no se utilizan. Esta lista puede estar lejos de estar completa, pero ya tiene las herramientas necesarias.

Otros consejos

Utilizamos Bullseye , y puedo recomendarlo. No necesita ejecutarse desde un entorno de prueba unitaria, aunque eso es lo que hacemos.

Use una herramienta de cobertura de código contra su conjunto de pruebas unitarias.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top