• Nenhum resultado encontrado

4.4 Ferramentas de Teste para Análise de Mutantes

4.4.1 Ferramentas de Teste para Programa

Nas seções seguintes serão apresentadas as ferramentas de teste propostas no passado para automação do processo da análise de mutantes, no contexto das linguagens Fortran-77, C e Java.

4.4.1.1 O Ambiente de Teste Mothra

Mothra é uma ferramenta de teste de software desenvolvida pela Purdue University e pelo Georgia Tech's Software Engineering Research Center. No geral, a ferramenta auxilia a equipe de teste mostrando o quão bom são seus conjuntos de casos de teste em relação a sua capacidade de revelar a presença de determinados tipos especícos de defeitos.

A interface do usuário é uma característica considerada muito importante do sistema Mothra. É onde toda a informação do usuário é apresentada e por onde toda a interação necessária com o ambiente de teste é realizada pelo usuário. Também relevante, não há limites impostos pelo ambiente, o que signica que o tamanho máximo de um programa é unicamente limitado pela capacidade de memória e processamento. A geração de casos de teste visando matar mutantes é outro fator importante para o processo do teste de mutação. Embora o ambiente de teste não tenha integração com nenhum gerador de casos de teste, a ferramenta permite que novas extensões sejam incorporadas ao ambiente de teste, inclusive extensões de geração de casos de teste.

O projeto do sistema Mothra foi designado a dar suporte a várias linguagens de pro- gramação. As primeiras versões do sistema incluíram apenas a linguagem Fortran 77.

Para dar início ao teste no ambiente Mothra, o usuário deve primeiramente criar um experimento. O experimento é composto por três etapas: preparação do teste, execução dos mutantes e análise. As etapas devem ser realizadas sequencialmente, mas podem ser repetidas o número de vezes que for necessário.

A preparação do teste é dado pela escolha da conguração da geração dos mutantes, e da entrada com os casos de teste. Para gerar mutantes no ambiente Mothra o usuário deve escolher os operadores de mutação e a porcentagem de mutantes que devem ser gerados a partir de cada operador de mutação.

Os mutantes são gerados e executados e as saída produzidas são comparadas com a saída do programa sob teste. Se as saídas são diferentes, então o mutante é dado como morto. Um mutante quando morto não é executado contra o restante dos casos de teste. A execução dos mutantes é uma etapa que não necessita da intervenção e interação do usuário.

Na etapa de análise o usuário deverá decidir se o conjunto de casos de teste é suciente para satisfazer algum critério de parada estabelecido por ele. Caso o critério de parada não seja satisfeito, o que signica que alguns mutantes ainda necessitam ser mortos, então o usuário deve melhorar seu conjunto de casos de teste. Opcionalmente, o usuário pode marcar os mutantes equivalentes gerados. A ferramenta facilita o trabalho de marcar os mutantes equivalentes apresentando ao usuário o trecho de código mutante e o trecho de código original correspondente. Maiores informações sobre o ambiente de teste Mothra podem ser encontradas em [14].

Proteum é o acrônimo do inglês Program Testing Using Mutants, uma ferramenta de teste com suporte à análise de mutantes. A ideia é que programas de várias linguagens possam ser utilizados para teste utilizando a ferramenta Proteum. O projeto inicial da ferramenta teve inicio com o teste de programas escritos na linguagem C.

As funcionalidades da ferramenta podem ser utilizadas seja pela interface gráca seja por linha de comando. Das funcionalidades, são básicas a geração, execução e análise de mutantes.

Para realizar o teste, o usuário inicialmente deve criar uma sessão de teste. As sessões de teste salvas pelo usuário podem ser recuperadas posteriormente. Assim, é possível interromper o teste salvando a sessão, e então continuar com o teste depois. Obrigatori- amente toda sessão deve ter um nome que a identica.

Ao criar uma sessão, o usuário deve também obrigatoriamente fornecer alguns dados: o endereço de onde o código fonte está no sistema de arquivos, o endereço de onde o executável do código fonte está no sistema de arquivos, o nome das funções que se deseja testar, e o comando utilizado para criar um executável.

A geração de mutantes depende da escolha dos operadores de mutação (de um total de 71 operadores de mutação) e da porcentagem de mutantes que devem ser gerados para cada operador. Uma vez denidos, a ferramenta pode então gerar mutantes e executá-los. Há dois modos de execução: modo normal e modo pesquisador. No modo pesquisador todos os mutantes são executados contra todos os casos de teste do conjunto. Por outro lado, no modo normal, se um mutante é morto este já não é mais executado contra o restante dos casos de teste.

O conjunto de casos de teste é considerado o elemento central da ferramenta. O usuário pode inseri-los manual e iterativamente, ou pode importar de um arquivo, desde que o arquivo esteja de acordo com alguns dos formatos interpretados pela ferramenta.

Após a execução dos mutantes contra os casos de teste é fornecido ao usuário o resul- tado a partir da execução. O resultado consiste em um relatório apresentando os mutantes mortos e os mutantes vivos. Se o resultado da análise de mutantes satisfaz algum critério de parada estabelecido pelo usuário, então o usuário pode encerrar a atividade. Caso contrário, o usuário pode criar mais casos de teste, com intenção de matar os mutantes vivos.

A tarefa de determinar se um mutante é equivalente ou não é delegada ao usuário da ferramenta. Dado que a quantidade de mutantes equivalentes pode ser alta e que a presença deles atrapalha na avaliação do conjunto de casos de teste, é essencial que todos os mutantes equivalentes sejam identicados e descartados na análise. Mais detalhes podem ser encontrados em[12].

4.4.1.3 MuJava

A ferramenta de teste MuJava foi desenvolvida por duas universidades, a Korea Advanced Institute of Science and Technology e a George Mason University. Assim como as demais ferramentas de teste para a análise de mutação, a MuJava também oferece suporte à geração, execução e análise dos mutantes para código Java.

MuJava oferece uma interface gráca divida em três áreas: geração de mutantes, vi- sualização dos mutantes, e execução do teste. Na área de geração de mutantes o usuário pode escolher as classes Java que deseja utilizar no teste, e em seguida escolher os ope- radores de mutação para aplicar nas classes escolhidas. Na segunda área o usuário pode então visualizar os mutantes gerados. O usuário deve fornecer os casos de teste para a ferramenta, os quais são chamadas de método de classe. A área de execução de mutan- tes contém as ações que implementam a execução e a análise de mutantes, fornecendo relatórios e a avaliação do conjunto de teste.

Com intenção de reduzir os custos do teste com mutantes, a ferramenta implementa duas técnicas de redução de custos: mutant schemata e bytecode translation. Assim como a técnica mutant schemata, a técnica bytecode translation também auxilia a reduzir custos de compilação. A ideia desta técnica é realizar as mutações diretamente no bytecode do programa original. Deste modo, é necessário apenas que o programa original seja compilado.

As técnicas de redução de custos mutant schemata e bytecode translation não são aplicadas em conjunto, mas sim em situações diferentes. Quando o operador de mutação realiza uma alteração que modica a estrutura do programa, tal como modicações nas declarações de variáveis e métodos, então a técnica bytecode translation é aplicada. Caso o operador de mutação realize uma alteração que modica apenas o comportamento do programa, tal como mutações não especícas de programas orientados a objeto, então a técnica mutant schemata é aplicada. Maiores informações sobre a ferramenta MuJava podem ser encontradas em [34].

4.4.1.4 Javalanche

A ferramenta Javalanche foi apresentada por Schuler e Zeller na Conferência de Engenha- ria de Software Européia em agosto de 2009, na Holanda. Os autores se propuseram a explorar várias técnicas de redução de custo utilizadas em outras ferramentas de teste de mutação e implementá-las na Javalanche, visando automação e eciência.

A princípio, a interface da Javalanche é a interface do Eclipse (https://eclipse.org/home/index.php), um ambiente de desenvolvimento para programas Java (e outras linguagens). Os criadores

da Javalanche desenvolveram um plug-in para o Eclipse, pelo qual a geração, execução e análise de mutantes são realizadas.

Algumas das técnicas de redução de custo mais conhecidas para o teste de mutação foram implementadas na Javalanche:

i) Mutação Seletiva. Muito semelhante à mutação restrita, na mutação seletiva seleciona-se um subconjunto pequeno de operadores de mutação, porém suciente para garantir um resultado muito próximo do resultado obtido pelo uso de todos os operadores de mutação;

ii) Mutant Schemata (ver Seção 2.2.2);

iii) Análise de Cobertura de Dados. Vericam-se previamente quais casos de teste são capazes de exercitar pelo menos uma mutação, são ignorados os casos de teste que não são capazes de exercitar mutação alguma;

v) Execução Concorrente. Execução de mutantes em tarefas concorrentes.

Mostrar a equivalência entre programas, na maioria das ferramentas, é uma tarefa delegada ao usuário, por se tratar de um problema indecidível. Entretanto, a Javalanche implementa um mecanismo que pode auxiliar o usuário a decidir se um mutante é equiva- lente ou não. Através do impacto da mutação, o qual pode ser denido pelo tempo de execução ou pela ordem de execução das declarações do programa, o usuário pode decidir se um mutante é equivalente. Se o impacto da mutação for muito alto então o usuário pode concluir que o mutante não é equivalente. Suponha que 50% das declarações exe- cutadas no mutante são diferentes das declarações executadas pelo programa original. O usuário pode concluir que o mutante não é equivalente, pois o impacto da mutação é igual a 50%, por exemplo. Mais informações sobre a Javalanche podem ser encontradas em [47].

4.4.2 Ferramentas de Teste para Especicação

Nas seções seguintes serão apresentadas as ferramentas de teste propostas para automação da análise de mutantes, no contexto de especicação em MEF, redes de Petri, e diagrama de estados da UML.

4.4.2.1 Proteum/FSM, Proteum/ST e Proteum/PN

A família de ferramentas Proteum é um conjunto de ferramentas, cada qual para um tipo de artefato diferente. Todas as ferramentas Proteum têm automação da análise de mutantes, o que envolve a geração, execução e análise dos artefatos mutantes e do artefato original.

Após a implementação da família Proteum para programas (Proteum-C e Proteum/IM), foram implementadas as ferramentas Proteum/FSM, Proteum/ST, e Proteum/PN.

A Proteum/FSM é uma ferramenta para automação da análise de mutantes para MEF, implementa os operadores de MEF e possui funcionalidades comuns das ferramentas da família Proteum. Maiores informações sobre a Proteum/FSM podem ser encontradas em [17].

A Proteum/ST é uma ferramenta para automação da análise de mutantes para o modelo Statecharts, implementa os operadores de mutação proposto por Fabbri et. al. [18], e possui as funcionalidades comuns das ferramenta da família Proteum. Maiores informações sobre a Proteum/ST podem ser encontradas em [50].

A Proteum/PN é uma ferramenta para automação da análise de mutantes para Redes de Petri, implementa operadores de mutação propostos, e possui funcionalidades comuns das ferramentas da família Proteum. Mais informações sobre a Proteum/PN podem ser encontradas em [11].

4.4.2.2 Plavis/FSM e JPlavis/FSM

O projeto Plavis foi idealizado e implementado por pesquisadores de universidades bra- sileiras, um projeto que objetiva a construção de um ambiente de teste integrado com suporte às atividades de vericação, validação e testes. O artefato padrão de teste da ferramenta é o modelo MEF.

A Plavis é um ambiente de teste de software o qual implementa a técnica de teste aná- lise de mutantes, e também implementa alguns algoritmos de geração de casos de teste. A implementação desses algoritmos e técnicas foi realizada utilizando uma arquitetura a qual aproveita de implementações de outras ferramentas. A Plavis é responsável por cons- truir a comunicação entre as ferramentas integradas através de adaptadores, convertem-se as saídas e as entradas das ferramentas para formatos aceitos e interpretáveis entre si.

As ferramentas utilizadas internamente pela Plavis são: i) MGASET [8], para geração de casos de teste para MEF;

ii) Condado [35], , para geração de casos de teste para MEF e MEFE;

iii) Proteum/FSM [17], para avaliação de casos de teste sob o critério análise de mutantes, para MEF.

Através da Plavis, os usuários podem utilizar os algoritmos e as técnicas disponíveis na ferramenta e realizar comparações entre as soluções apresentadas. A ferramenta foi desenvolvida para operar na Web, mas também é possível utilizá-la em uma máquina local. Mais informações sobre a Plavis podem ser encontradas em [48].

Em continuação ao projeto Plavis, a JPlavis foi desenvolvida com o objetivo de ofe- recer maior portabilidade e facilidade de instalação em comparação com seu predecessor. Mesmo na máquina local, para utilizar a Plavis, o usuário é obrigado a congurar um servidor local antes de instalar a ferramenta.

Tanto a Plavis quanto a JPlavis possuem interface gráca. Na JPlavis, o editor de modelo de estados foi modicado, no qual o editor utiliza-se de componentes de edição de terceiros.

Na família Plavis (Plavis e JPlavis), o teste inicia com a criação de um projeto de teste (o qual difere dos projetos criados em ambientes de desenvolvimento de software). O usuário então informa qual a MEF para testes, e então seleciona os casos de teste os quais também podem ser gerados através dos métodos de geração de casos de teste disponíveis na ferramenta. Em seguida, os operadores de mutação podem ser selecionados para geração de mutantes. Os mutantes podem ser marcados como equivalentes através da interface gráca da ferramenta. A Plavis e a JPlavis implementam a geração, execução e análise de mutantes, assim como a geração de casos de teste. É possível também adicionar casos de teste manualmente. Mais informações sobre a JPlavis podem ser encontradas em [39].

4.4.2.3 MoMut::UML

MoMut::UML é uma ferramenta que aplica o teste baseado em mutação de modelo em modelos da UML, especicamente para diagramas de estados e diagramas de classes da

logias de redução de custo: mutação restrita (MR), mutação aleatória (MA) e execução concorrente.

Nome MR MA Execução Concorrente Extensões

Plavis x x

Proteum x x

MoMut ? ? ? ?

StateMutest x x x x

UML. A principal funcionalidade da ferramenta é a geração de casos de teste abstratos. Diferentemente das outras ferramentas apresentadas anteriormente, as quais estão no contexto da análise de mutantes, a MoMut::UML está no contexto das ferramentas de automação do teste baseado em mutação de modelo. Basicamente a MoMut::UML não visa avaliar conjuntos de casos de teste baseado no critério análise de mutantes, mas sim em gerar conjuntos de casos de teste baseado no critério análise de mutantes.

No processo de teste baseado em mutação de modelo, o critério para geração de casos de teste utilizado é o critério análise de mutantes, assim, após a entrada com o modelo de estados a ferramenta realiza a geração de mutantes e a geração de casos de teste, os quais são capazes de matar a maioria dos mutantes gerados, e em seguida continua o processo com a concretização, execução e análise dos resultados (ver Capítulo ??).

Mais informações sobre a MoMut::UML e sobre o processo de teste baseado em mu- tação de modelo podem ser encontradas em [31].

4.4.3 Comparativo

A seguir serão apresentados os comparativos entre as funcionalidades das ferramentas apresentadas neste capítulo, juntamente com a StateMutest. As ferramentas de teste de software para programas não foram consideradas no comparativo, pois não estão relacio- nadas com o escopo deste trabalho.

Na Tabela 4.2 é feito um comparativo entre as ferramentas vericando quais imple- mentam tecnologias que ajudam a melhorar a atividade de teste, tais como as técnicas de redução de custo e o suporte às extensões. É interessante ressaltar que a StateMutest se preocupou em mostrar desempenho no processo da análise de mutantes, e também per- mite ao usuário adicionar novas funcionalidades de uma forma muito rápida e prática por meio das extensões. As descrições apresentadas sobre a MoMut não explicitam a utiliza- ção ou não de alguma das tecnologias abordadas na Tabela 4.2, indicado por "?", o que signica ausência de informação para conclusões sobre as funcionalidades da ferramenta baseado nas referências encontradas.

Na Tabela 4.3 é feito um comparativo entre as ferramentas apresentando os modelos utilizados para geração de casos de teste. Apenas a MoMut, entre as ferramentas apresen- tadas, é quem gera casos de teste visando atender aos requisitos da análise de mutantes. A StateMutest utiliza o MOST para gerar casos de teste para FSM e EFSM.

Na Tabela 4.4 é feito um comparativo entre as ferramentas vericando o tipo de execução de modelo implementada. A Plavis e a Proteum realizam execução simbólica,

Tabela 4.3: Comparativo das ferramentas e dos modelos utilizados para geração de casos de teste

Nome FSM EFSM UML

Plavis x x

Proteum x

MoMut x

StateMutest x x

Tabela 4.4: Comparativo vericando o tipo de execução utilizada pela ferramenta para executar um modelo.

Nome Execução Simbólica Execução Concorrente

Plavis x

Proteum x

MoMut x

StateMutest x

ou seja, não é gerado nenhum modelo executável para realização dos testes. A execução concreta neste caso acontece quando o modelo é derivado em um modelo executável.

StateMutest

A StateMutest é uma ferramenta de automação de testes baseados em modelo. A ferra- menta é uma realização da Universidade Estadual de Campinas em parceria com membros da Universidade Federal de São Carlos (UFSCar) e do Instituto Nacional de Pesquisas Espaciais (INPE).

Uma das motivações para o desenvolvimento da StateMutest foi baseada a partir de um trabalho prévio do grupo [33], que se propôs a avaliar o potencial para revelar a pre- sença de falhas de um método para geração de conjuntos de teste a partir de MEFEs. Naquele trabalho, foram utilizados operadores de mutação de programas, dado que o mo- delo executável utilizado para a geração de sequências de entrada está na linguagem Java. O problema com essa estratégia é que muitos mutantes não eram ativados, pois eram inseridos em partes do código que não eram relacionados ao modelo. A ideia então foi uti- lizar uma ferramenta de mutação baseada em especicação, que complementasse a JPlavis (Seção 4.4.2.2), acrescentando operadores de MEFE. No entanto, devido à diferenças na execução do modelo, dentre outras, acabou sendo criada uma plataforma independente.

As seções a seguir abordam os requisitos levantados durante o projeto de desenvolvi- mento da ferramenta, os detalhes de desenvolvimento, os modelos de processo, e o modelo da arquitetura da ferramenta.

Documentos relacionados