Geração Automática de Teste Unitário com Cobertura de Código Otimizada - Leitão, Nuno Miguel Apolinário (2015)
O teste de software é o principal modo de veri car a correção deste. Normalmente constitui 50% do seu custo de desenvolvimento. Existem diversas estratégias de teste de software mas, nesta dissertação, é essencialmente abordado o teste unitário, uma forma de teste que permite a análise de pequenos componentes individuais do sistema (funções, classes ou módulos). O seu principal objetivo é detetar erros lógicos nos componentes, veri car corner cases e tentar obter a maior cobertura de código testado possível. O grande problema desta abordagem é ser, normalmente, um processo manual, o que por sua vez o torna dispendioso, propício a erros e bastante demorado. Portanto seria uma mais valia conseguir automatizar o processo de geração e execução do teste unitário com uma elevada cobertura de código. Nesta dissertação é apresentado e explorado o conceito de testes Concolic com o intuito de permitir ultrapassar algumas das limitações anteriormente mencionadas. O teste Concolic junta duas técnicas de teste de software: teste com valores concretos e simbólicos simultaneamente. Atualmente existem várias ferramentas que permitem realizar este tipo de teste de software e esta dissertação inspira-se sobre uma delas. O principal foco desta dissertação foi a exploração e possível integração de uma ferramenta de teste Concolic no Frama-C. O Frama-C, implementado em Objective Caml (Ocaml), disponibiliza um conjunto de ferramentas dedicadas a análise de código C. Fornece várias técnicas de análise estática numa única framework e é usado atualmente por empresas como Airbus e Dassault Aviation. Deste modo foram analisadas e estudadas um conjunto de ferramentas que permitissem realizar teste Concolic. Posteriormente foi escolhida uma ferramenta (Crest) com o intuito adaptar os seus processo à plataforma Frama-C e à respetiva implementação em Ocaml. Esta ferramenta permite a execução de testes Concolic de programas desenvolvidos na Linguagem C e contempla várias etapas: 1. Inicialmente é feita automaticamente a instrumentação do código, isto é, altera-se o código original para um código que realize chamadas a funções que permitam a sua execu ção simbólica. Se o programa for fornecido com valores concretos, este produz o mesmo output que o original. Esta etapa é feita através do Common Intermediate Language (CIL). 2. Finda a instrumentação é feito um ciclo de execução em que são armazenadas um conjunto de restrições das várias condições encontradas. Estas condições são armazenadas e posteriormente resolvidas, fazendo uso do Yices, e assim gerar novos valores para, na próxima execução, percorrer diferentes caminhos. O resultado nal desta dissertação contempla a adaptação dos principais funamentos do Crest a uma implementação OCaml e respetiva integração em Frama-C. Todas as etapas foram implementadas desde as várias etapas da instrumentação à execução dos testes, geração automática de inputs e integração no Frama-C.