Este documento descreve uma técnica para geração aleatória de dados de teste para software orientado a objetos. A técnica gera valores aleatórios para tipos primitivos, objetos e vetores, e permite valores direcionados para melhor direcionar os dados de teste. A técnica foi implementada em um framework e validada em termos de tempo de geração para diferentes quantidades de dados.
Geração Aleatória de Dados Para Programas Orientados a Objetos.
1. 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
2. INTRODUÇÃO
• 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.
3. 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).
4. GERAÇÃO DE DADOS PARA SOFTWARE O.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.
7. 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.
8. 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.
9. 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;
10. 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.
11. 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.
12. 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.
13. VALIDAÇÃO DA TÉCNICA
Ambiente utilizado:
- Microsoft Windows 7/64 bits
- Processador Intel 17 2.50GHz
- 4Gb RAM
- Java 1.6
Indivíduos Tempo (segundos)
100 0,109
1.000 0,235
10.000 0,766
100.000 5,86
16. CONCLUSÃO
• 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.
17. TRABALHOS FUTUROS
• 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
18. REFERÊNCIAS
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.