Pergunta

Sou um desenvolvedor de software relativamente novo e atualmente trabalho adicionando testes de unidade a um projeto C++ existente que começou anos atrás.Devido a um motivo não técnico, não tenho permissão para modificar nenhum código existente.A classe base de todos os meus módulos possui vários métodos para configurar/obter dados e se comunicar com outros módulos.

Como desejo apenas testar a unidade de cada módulo individual, quero poder usar valores predefinidos para todos os meus métodos de comunicação entre módulos.Ou sejapara um método Ping() que verifica se outro módulo está ativo, quero que ele retorne verdadeiro ou falso com base no tipo de teste que estou fazendo.Estive pesquisando o Google Test e o Google Mock, e ele oferece suporte à simulação de métodos não virtuais.No entanto, a abordagem descrita (http://code.google.com/p/googlemock/wiki/CookBook#Mocking_Nonvirtual_Methods) exige que eu "modele" os métodos originais para aceitar objetos reais ou simulados.Não posso modelar meus métodos na classe base devido ao requisito mencionado anteriormente, então preciso de outra maneira de zombar desses métodos virtuais

Basicamente, os métodos que desejo simular estão em alguma classe base, os módulos dos quais desejo testar a unidade e criar simulações são classes derivadas dessa classe base.Existem módulos intermediários entre minha classe Módulo base e os módulos que desejo testar.

Eu apreciaria qualquer conselho!

Obrigado,

Testemunha de Jeová

EDITAR:Exemplos mais concretos

Minha classe base é, digamos, rootModule, o módulo que quero testar é leafModule.Existe um módulo intermediário que herda de rootModule, leafModule herda deste módulo intermediário.

Em meu leafModule, quero testar o método doStuff(), que chama o GetStatus(moduleName) não virtual definido na classe rootModule.Eu preciso de alguma forma fazer com que GetStatus() retorne um valor fixo escolhido.Zombar é novo para mim, então usar objetos simulados é a abordagem correta?

Foi útil?

Solução

Eu escreveria um script Perl/Ruby/Python para ler na árvore de origem original e escreveria uma árvore de origem simulada em um diretório diferente.Você não precisa analisar completamente o C++ para substituir uma definição de função.

Outras dicas

Existem algumas maneiras diferentes de substituir funções não virtuais. Uma é reciar-os novamente e compilar um novo executável de teste para cada conjunto diferente de funções não virtuais que você deseja testar. Isso é dificilmente escalável.

Uma segunda opção é torná -los virtuais para teste. A maioria dos compiladores permite que você defina algo na linha de comando, então compile seu código com -dtest_virtual = virtual ou -dtest_virtual para torná -los virtuais ou normais, dependendo se está ou não ou não.

Uma terceira opção que pode ser utilizável é usar uma estrutura de zombaria que permita zombar de funções não virtuais. Eu sou o autor de Hippomocks (isenção de responsabilidade em relação à neutralidade e assim por diante) e recentemente adicionamos a capacidade de zombar das funções C Plain C nas plataformas x86. Isso pode ser estendido a funções de membros não virtuais com um pouco de trabalho e seria o que você está procurando. Lembre -se de que, se o seu compilador puder ver o uso e a definição de uma função ao mesmo tempo, ele poderá embrulhá -lo e que a zombaria pode falhar. Isso se mantém em particular para funções definidas nos cabeçalhos.

Se a função C regular é suficiente para você, você pode usá -la como é agora.

Uma abordagem seria especificar diferentes fontes para testes. Digamos que seu destino de produção use rootmodule.h e rootmodule.cpp. Use fontes diferentes para o seu alvo de teste. Você pode especificar um cabeçalho diferente alterando seu caminho de inclusão, para que #include "rootmodule.h" realmente carregue o unittest/rootmodule.h. Em seguida, zombe do rodovia root ao conteúdo do seu coração.

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