Da mesma maneira em que os modelos são executados, dinamicamente, as extensões também são executadas utilizando dos mesmos mecanismos de execução dinâmica. As extensões são compostas por coleções de classes Java compiladas. O único conhecimento que a StateMutest tem das extensões é dado através do arquivo descritor da extensão e da interface de implementação. Assim, a StateMutest primeiro carrega as classes Java, inicializa o objeto de instância e invoca os métodos através da interface de implementação. O modo mais prático para adicionar determinadas funcionalidades na ferramenta é através da criação de extensões. Extensões são úteis, pois permitem aos usuários adicio- narem funcionalidades que não existem na ferramenta.
Há duas formas de se adicionar uma extensão na StateMutest. A primeira envolve a determinação de todos os atributos que descrevem uma extensão, e os respectivos arquivos Java. A segunda é relativamente simples, o usuário só precisa fornecer um único arquivo que contém todos os arquivos Java e um arquivo com todos os atributos da extensão, pré-denidos (pacote da extensão).
O formato do pacote de extensão da StateMutest é o formato SMP (StateMutest Plugin). O pacote de extensão é um arquivo compactado contendo todos os arquivos Java e um arquivo chamado main.inf, o qual é um arquivo no formato XML com todos os atributos que descrevem a extensão.
A Figura 5.17 mostra um exemplo da estrutura interna do arquivo main.inf, com detalhes de uma extensão chamada Alpha TestC Selector, a qual como resultado produz dois novos subconjuntos de casos de teste a partir de um existente.
Todos os arquivos de uma extensão instalada são copiados para os diretórios de onde a ferramenta se encontra no sistema de arquivos do sistema operacional. As extensões obrigatoriamente devem ser nomeadas e categorizadas. A categorização determina a per-
Figura 5.17: Conteúdo do arquivo main.inf, exemplo.
missão de onde uma determinada extensão poderá ser carregada e utilizada na ferramenta. Os nomes servem de identicadores para os usuários. As categorias disponíveis são: (a) geração de casos de teste; (b) gerenciadores de casos de teste.
Quando requisitadas, as extensões são carregadas e instanciadas, e seus serviços são fornecidos através da assinatura de método de suas interfaces. Cada categoria fornece uma interface de implementação, a qual é utilizada pela ferramenta para a chamada de métodos.
5.10.1 Extensão TestC Alpha Filter e TestC Alpha Selector
Nesta seção são apresentadas duas extensões implementadas para a ferramenta State- Mutest (utilizadas nos experimentos descritos no Capítulo 6): TestC Alpha Filter e TestC Alpha Selector. Ambas as extensões são de ltragem de casos de teste, o que signica que a partir de um conjunto de casos de teste original é gerado outro conjunto de casos de teste modicado. Os conceitos e os algoritmos apresentados aqui são importantes para o entendimento de assuntos conseguintes deste trabalho.
Os conjuntos de casos de teste em questão são: o conjunto de casos de teste de caminho nominal (N), o conjunto de casos de teste de sequência de entrada mais longa (A1), e o conjunto de casos de teste de sequência de entrada mais curta (A2).
O conjunto N é composto por casos de teste que contêm apenas sequências de eventos que são capazes de alterar o estado corrente do modelo quando disparados. Para isto, utilizou-se de um algoritmo que ltra os casos de teste do conjunto original criando outro conjunto a partir do original, porém eventos que não são capazes de alterar o estado do modelo no momento em que são disparados são excluídos. O ltro é uma extensão da StateMutest, denominado TestC Alpha Filter.
Para tornar mais claro o entendimento da extensão TestC Alpha Filter, considere a Figura 5.18. Considere as seguintes sequências de teste:
Sequência 1 (t1 ). s1 = {ON, OF F, OF F, ON }
Sequência 2 (t1 ). s2 = {ON }
Figura 5.18: Modelo exemplo de uma máquina de estados estendida da StateMutest, com dois estados e duas transições.
Sequência 4 (t2 ). s4 = {ON, ON, ON, OF F, ON, OF F, ON }
Fornecendo as entradas em s1 contra o modelo da Figura 5.18, obtem-se a saída o1 =
{00on00,00of f00,00on00}. Note que o terceiro evento da sequência s
1 (OFF) não produziu
nenhum resultado, pois o modelo não trata deste evento quando no estado o. Por se tratar de uma máquina especicada incomplemente, alguns estados podem então não ter correspondência com algum dos eventos denidos. A UML e o SMC lidam com isso através de uma transição padrão (default transition), uma transição que ocorre toda vez que um estado não trata um determinado evento e há a ocorrência deste evento. Considera-se neste trabalho a transição padrão como uma transição vazia (nenhuma saída é produzida). A extensão TestC Alpha Filter ltra então ocorrências de transições padrão, produzindo assim uma sequência nominal de teste.
Aplicando a extensão TestC Alpha Filter, obtêm-se as seguintes sequências de teste: Sequência 1 (t1 ). sf 1= {ON, OF F, ON }
Sequência 2 (t1 ). sf 2= {ON }
Sequência 3 (t2 ). sf 3= {ON, OF F }
Sequência 4 (t2 ). sf 4= {ON, OF F, ON, OF F, ON }
Os conjuntos A1 e A2 também foram gerados utilizando-se de uma extensão da Sta- teMutest chamada TestC Alpha Selector. O algoritmo agrupa os resultados obtidos para cada transição do modelo, separa o caso de teste de sequência mais longa e o caso de teste de sequência mais curta, e os divide em dois subconjuntos de teste. Casos de teste de sequência mais longa são inseridos no conjunto A1, e casos de teste de sequência mais curta são inseridos no conjunto A2. Deste modo, tanto o conjunto A1 e o conjunto A2 contém a mesma quantidade de casos de teste, correspondente à quantidade de transições do modelo.
Figura 5.19: Procedimento básico, uxograma para importação de casos de teste e pre- paração dos conjuntos N, A1 e A2. N é o conjunto nominal de casos de teste. A1 é o conjunto de sequências de entrada mais curta, e A2 é o conjunto de sequências de entrada mais curta.
Novamente, considere o modelo da Figura 5.18, e as sequências s1, s2, s3 e s4, como
exemplo. s1 e s2 devem passar pela transição 1 (t1 ). Do mesmo modo, s3 e s4 devem
passar pela transição 2 (t2 ). Para cada transição, são selecionadas duas sequências: a mais curta e a mais longa. A sequência mais curta para a transição t1 é a sequência s2,
por exemplo, com apenas 1 evento (ON). Assim, o conjunto de sequências mais curta para o modelo da Figura 5.18 é o conjunto Ccurta = {s2, s3}. O conjunto de sequências mais
longa é o conjunto Clonga = {s1, s4}.
Experimentos
Este capítulo tem o objetivo de apresentar o projeto e a implementação dos estudos de caso realizados neste trabalho. Cinco (5) estudos foram conduzidos, os quais respondem à questões de pesquisa relacionadas à eciência de uso da StateMutest, e à qualidade de um teste realizado por esta. Um teste na ferramenta depende da criação de modelos (gracamente ou textualmente) e da elaboração de casos de teste (manual ou automatica- mente, neste último o algoritmo MOST pode ser utilizado dentro do ambiente). Baseado em experimentos realizados em [33] e consideradas as questões de pesquisa levantadas, novas questões foram propostas sobre o algoritmo MOST e à análise de muttantes, neste último, perguntas relacionadas aos aspectos de redução de custo com a análise de mutan- tes. Todos os itens estudados nesta seção inuenciam na eciência e efetividade de um teste na ferramenta e servem como fonte de validação da ferramenta proposta. Outros algoritmos podem ser utilizados, mas neste trabalho apenas um algoritmo de geração de sequências foi considerado devido à limitações de cronograma.
6.1 Objetivos
O MOST utiliza um critério baseado em propósito de teste. Segundo Grabowski et. al. [23] um propósito de teste pode ser uma sequência de eventos ou mesmo um conjunto de estados os quais devem ser alcançados pela implementação. O propósito de teste do MOST é um conjunto de transições que devem ser alcançadas (transição alvo mais o conjunto de cobertura).
O conjunto de cobertura pode conter uma ou mais transições do modelo. Assim, se o testador desejar garantir um conjunto de sequências de entrada capaz de percorrer todas as transições do modelo, o testador então pode criar um conjunto de cobertura que contenha todas as transições.
O que não é possível conhecer a priori sobre um conjunto de sequências de entrada gerado pelo MOST é a sua capacidade em revelar a presença de defeitos. Devido à MEFE ser o artefato para geração de casos de teste do algoritmo, especicamente não é conhecida a capacidade do conjunto em revelar a presença dos possíveis defeitos especícos desta.
A seguir estão listadas as questões que guiaram este trabalho, a maioria relacionada à geração de sequências de entrada e a efetividade de teste, outras para a análise de
1) O quão bom são os conjuntos de sequências de entrada gerados pelo MOST (poten- cial de detecção), em revelar a presença de determinados tipos especícos de defeitos de máquina de estados nita?
2) É possível selecionar aleatoriamente uma amostra de mutantes, sendo a amostra composta de 10% de indivíduos (como no trabalho de Acree JR [1]), para cada operador de mutação, e manter um escore de mutação cujo desvio é menor do que 5%?
3) Considerando um limiar ótimo de 95%, em média, é possível armar que sequências de entrada geradas pelo MOST obtêm escores de mutação superior ao limiar ótimo? 4) As sequências de entrada geradas pelo MOST têm mais diculdade em matar os mutantes gerados através de operadores de máquina de estados, ou através de ope- radores de mutação de máquina de estados nita estendida?
5) Não existe diferença signicativa no escore de mutação entre sequências de entrada nominais (SEN) e sequências de entrada inoportunas (SEI)?
6) Sequências de entrada mais longas (SEML) são mais efetivas do que sequências de entrada mais curtas (SEMC), em termos da capacidade de revelar a presença de defeitos?
7) Existe diferença signicativa em utilizar mais de um subprocesso ao invés de um único subprocesso durante a execução dos mutantes?
Os resultados obtidos podem ajudar na formulação de novas hipóteses, e auxiliar as equipes de teste que utilizam o método de geração de sequências de entrada MOST a selecionar um subconjunto representativo das sequências de entrada geradas, visando diminuir perda em eciência de um teste. Além disso, através da redução signicativa de mutantes e da redução signicativa de casos de teste utilizados durante a análise de mutantes, reduz-se signicativamente também os recursos computacionais e o tempo gasto durante a geração, execução e análise de mutantes.