Pergunta

Fundo

Eu tenho um aplicativo escrito em C ++ nativo ao longo de vários anos que é de cerca de 60 KLOC. Há muitas muitas funções e classes que são mortos (provavelmente 10-15% como a questão com base Unix similar abaixo pediu). Recentemente, começou a fazer testes unitários em todos os novo código e aplicá-lo ao código modificado sempre que possível. No entanto, gostaria de fazer uma SWAG que temos cobertura de teste inferior a 5% no momento atual.

Pressupostos / Restrições

O método e / ou ferramentas devem apoiar:

  • Native (ou seja, não gerenciado) C ++
  • Windows XP
  • Visual Studio 2005
  • Não deve exigir casos de teste fornecido pelo usuário para a cobertura. (Por exemplo, não pode depender de testes de unidade para gerar cobertura de código)

Se os métodos suportar mais do que esses requisitos, então ótimo.

NOTA: Atualmente usamos a edição Professional do Visual Studio 2005, não o Team System. Portanto, usando Team System pode ser um válido sugestão (Eu não sei, eu nunca utilizado) no entanto eu estou esperando que ele não é o única solução.

Por que usar testes de unidade para cobertura de código é problemático

Eu acredito que é impossível para uma ferramenta genérica para encontrar todos os mortos (código por exemplo inacessível) em qualquer aplicação arbitrária com zero falsos positivos (acho que isso seria equivalente ao problema da parada). No entanto, eu também acredito que é possível para uma ferramenta genérica para encontrar muitos tipos de código morto que são altamente provável que na verdade estar morto, como classes ou funções que nunca são referência no código por qualquer outra coisa.

Usando testes de unidade para fornecer essa cobertura, você não está mais usando um algoritmo genérico e estão aumentando, assim, tanto a porcentagem de código morto pode detectar e a probabilidade de que todos os acessos não são falsos positivos. Por outro lado, usando testes de unidade pode resultar em falsos negativos desde testa a unidade si pode ser a única coisa que o exercício de um determinado pedaço de código. Idealmente, eu teria de testes de regressão que exerce todos os métodos disponíveis externamente, APIs, controles de usuário, etc, que serviriam como uma medida de referência de análise de cobertura de código para excluir certos métodos de ser falsos positivos. Infelizmente no entanto, eu não tenho esse teste automatizado no presente momento.

Uma vez que tenho essa grande base de código com um tão baixo teste percentual de cobertura caso, no entanto, eu estou procurando algo que pudesse ajudar sem exigir enormes quantidades de tempo investido em escrever casos de teste.

Pergunta

Como você vai fazer sobre a detecção de código morto de forma automatizada ou semi-automatizada em um aplicativo nativo C ++ na plataforma Windows com o ambiente de desenvolvimento Visual Studio 2005?

Consulte também

detecção de códigos Dead in legado C / C ++ projeto eu quero dizer a VC ++ Compiler compilar todo o código. isso pode ser feito?

Foi útil?

Solução

Pergunte o vinculador para remover objetos sem referência (/ OPT: REF). Se você usar a função de nível de vinculação e de saída vinculador detalhado, a saída vinculador irá listar todas as funções pode revelar-se não é utilizada. Esta lista pode ser longe de ser completa, mas você já tem as ferramentas necessárias.

Outras dicas

Bullseye , e posso recomendá-lo. Ele não precisa ser executado a partir de um ambiente de teste de unidade, apesar de que é o que fazemos.

Use uma ferramenta de cobertura de código contra a sua unidade de teste.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top