geração aleatória de dados para programas orientados a objetos
DESCRIPTION
A geração aleatória de indivíduos de teste é muito utilizada por técnicas de geração de dados de teste como Têmpera Simulada, Subida de Encosta e Algoritmos Evolucionários. Este artigo descreve uma nova técnica de geração aleatória de indivíduos de teste para programas escritos em linguagens orientadas a objetos. Diferentemente das anteriores, a técnica proposta permite a geração aleatória de valores para tipos primitivos e objetos, geração de valores para vetores e uso de geração aleatória dirigida de valores. Validações iniciais mostram que os custos para gerar dados de teste são limitados. A técnica descrita é parte de um arcabouço para geração de dados de teste.TRANSCRIPT
Fernando H. Ferreira1, Márcio E. Delamaro2, Marcos L. Chaim1, Fátima L. S. Nunes1 e Auri M. Vincenzi3
1 Escola de Artes, Ciências e Humanidade (EACH) Universidade de São Paulo – São Paulo, SP – Brasil 2 Instituto de Ciências Matemáticas e de Computação (ICMS) Universidade de São Paulo – São Carlos, SP – Brasil 3 Instituto de Informática (INF) Universidade Federal de Goiás – Goiânia, GO – Brasil
• Testes manuais são custosos e consomem muito tempo.
• Técnicas de geração automática de dados de teste permitem a redução do custo de desenvolvimento e aumento da qualidade do software.
• Muitas destas técnicas de geração de dados de teste utilizam a geração aleatória de dados como um passo essencial.
INTRODUÇÃO
• Normalmente a geração aleatória é feita para parâmetros primitivos.
• Mas nem todos os parâmetros são tipos primitivos…
• A geração aleatória deve ser adaptada a orientação a objetos (OO).
INTRODUÇÃO
• Ao contrário do software procedimental, o software OO nem sempre se comporta da mesma maneira ao executarmos o mesmo método com os mesmos valores de entrada.
• O estado de um objeto, em um dado momento, pode modificar o comportamento de seus métodos.
GERAÇÃO DE DADOS PARA SOFTWARE O.O.
GERAÇÃO DE DADOS PARA SOFTWARE O.O.
GERAÇÃO DE DADOS PARA SOFTWARE O.O.
• Técnica de geração aleatória de dados de teste:
– Vetores;
– Instâncias de objetos;
– Tipos primitivos;
– Uso de valores aleatórios dirigidos.
• Esta técnica faz parte de um framework gerador de dados de teste e funciona de modo complementar a outras técnicas de geração de dados de teste.
GERAÇÃO DE DADOS PARA SOFTWARE O.O.
• Leitura do bytecode
– Pré-processamento necessário para identificação de todas as dependências da classe sob teste.
– Sempre que a dependência a um objeto é identificada é preciso identificar suas respectivas dependências.
– Este processo evita a releitura do bytecode durante a geração aleatória de objetos.
GERAÇÃO DE DADOS PARA SOFTWARE O.O.
• Geração de indivíduos
– Criação do indivíduo • Criação de uma instância da classe sob teste;
• Composto por: um construtor, métodos intermediários e o método sob teste;
• Esta criação de indivíduos também é executada para parâmetros que são objetos.
– Atribuição de valores aleatórios
• Leitura da estrutura do objeto criado;
• Geração de valores aleatórios para tipos primitivos;
GERAÇÃO DE DADOS PARA SOFTWARE O.O.
• Geração dirigida de valores aleatórios
– Passagem de valores que direcionem a geração aleatória de valores dos tipos primitivos.
– Direcionam o domínio de entrada a um intervalo específico de valores.
– A geração aleatória dirigida é ideal em cenários nos quais temos conhecimento dos possíveis domínios de entrada esperados pelos métodos sob teste.
– Este recurso é útil, pois torna a geração aleatória de valores menos abrangente e mais precisa.
GERAÇÃO DE DADOS PARA SOFTWARE O.O.
• Geração de valores para vetores
– Reutiliza as lógicas para geração de valores aleatórios para objetos e tipos primitivos.
– Identificação do tipo de dados base do vetor.
– Geração de um tamanho aleatório para o vetor.
– Geração de valores para cada indivíduo do vetor.
GERAÇÃO DE DADOS PARA SOFTWARE O.O.
• Formatos para exportação dos dados gerados
– Representação de indivíduos proposta por Tonella (2004).
– Classes de teste no formato Junit.
GERAÇÃO DE DADOS PARA SOFTWARE O.O.
VALIDAÇÃO DA TÉCNICA
Indivíduos Tempo (segundos)
100 0,109
1.000 0,235
10.000 0,766
100.000 5,86
Ambiente utilizado: - Microsoft Windows 7/64 bits - Processador Intel 17 2.50GHz - 4Gb RAM - Java 1.6
VALIDAÇÃO DA TÉCNICA
Formato JUnit
Representação de Tonella (2004)
VALIDAÇÃO DA TÉCNICA
Formato JUnit
Representação de Tonella (2004)
• Vantagens da técnica:
– Geração aleatória de indívíduos para programas escritos em linguagens orientadas a objetos.
– Geração de valores para tipos primitivos, objetos e vetores.
– Geração aleatória dirigida de valores.
– Exportação dos resultados em dois formatos.
– Custo reduzido para geração de indivíduos de teste.
CONCLUSÃO
• Construção de um framework gerador de dados de teste que inclua diversas técnicas de geração de dados.
• Uso de benchmarks mais expressivos
TRABALHOS FUTUROS
Miraz, M., Lanzi, P. L., e Baresi, L. (2009). Testful: Using a hybrid evolutionary algorithm for testing stateful systems. Genetic and Evolutionary Computation Conference, pages 1947–1948.
Pacheco, C. e Ernst, M. (2007). Randoop: feedback-directed random testing for Java. Object-Oriented Programming, Systems, Languages & Applications, Montreal, Canada.
Pacheco, C., Lahiri, S., e Ball, T. (2008). Finding Errors in .Net with Feedback-Directed Random Testing. International Symposium on Software Testing and Analysis, Seattle, WA, USA.
Silva, L. S. e van Someren, M. (2010). Evolutionary testing of object-oriented software. Association for Computing Machinery - Symposium on Applied Computing, pages 1126–1130.
Tonella, P. (2004). Evolutionary Testing of Classes. ITC-irst Centro per la Ricerca Scientifica e Tecnologica, Italia.
REFERÊNCIAS