Escolar Documentos
Profissional Documentos
Cultura Documentos
Cincia da Computao
Belo Horizonte
2015
Lorena Danielle Gonalves Bento
Belo Horizonte
2015
Lorena Danielle Gonalves Bento
Os softwares possuem grande impacto na sociedade atual, sendo cada vez mais presen-
tes em diversas reas e espaos. A qualidade de software uma propriedade essencial na
garantia da conformidade dos requisitos. O teste de software a prtica mais utilizada na
minimizao do nmeros de defeitos e na garantia da qualidade de software, no entanto,
uma das etapas que mais consomem tempo e recursos no processo de desenvolvimento
de software.
A atividade de teste consome cerca de 50% dos recursos totais do projeto (HAR-
ROLD, 2000) e 50% do tempo gasto no desenvolvimento do cdigo (BEIZER, 1990). A
tarefa de automatizao para gerao de dados de teste ainda difcil e complexa de ser
automatizada, sendo este um problema equivalente ao problema da parada (HOWDEN,
1975).
O presente trabalho tem por objetivo a implementao de uma ferramenta para ge-
rao automatizada de dados de testes e anlise de cobertura de desvio para softwares
desenvolvidos na linguagem Java. Para isto, foi desenvolvida uma heurstica aplicada
a ferramenta desenvolvida, DataGen, que gera dados de teste e apresenta uma anlise
detalhada da cobertura dos dados de testes gerados.
Este trabalho compara tambm os resultados obtidos frente a outras formas descritas
na literatura.
1 INTRODUO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.1 Justificativa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.2 Problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.3 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.3.1 Objetivos Gerais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.3.2 Objetivos Especficos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2 REFERENCIAL TERICO . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.1 Orientao a objetos e a linguagem de programao Java . . . . . . . . 11
2.1.1 Tipos primitivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2 Teste de Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.3 Falha, Erro e Defeito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.4 Estratgia de Testes de Software . . . . . . . . . . . . . . . . . . . . . . . . 13
2.5 Teste Estrutural ou Caixa-Branca . . . . . . . . . . . . . . . . . . . . . . . 14
2.6 Tcnicas baseadas em Estrutura ou Caixa-Branca . . . . . . . . . . . . . 15
2.6.1 Teste de Instruo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.6.2 Teste de Desvio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.7 Gerao de Dados de Teste . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.8 API Java Reflection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.9 Trabalhos Relacionados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3 Metodologia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4 DATAGEN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.1 Descrio da Ferramenta . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.2 Requisitos Funcionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.3 Casos de Uso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.4 Diagrama de Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.5 Heurstica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.6 Camada de Apresentao . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.7 Camada de Negcios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
6 CONCLUSO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Referncias Bibliogrficas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
1 INTRODUO
1.1 Justificativa
A atividade de teste atualmente uma das atividades mais utilizadas para garantir
a qualidade durante o desenvolvimento de software. Partindo dos princpios que o teste
exaustivo impossvel de ser alcanado e que grande parte das falhas esto concentradas
em pequenos mdulos do sistema (GRAHAM, 2012), uma ferramenta de suporte para
gerao de dados e de anlise do cdigo fonte de suma importncia.
1.2 Problema
1.3 Objetivos
Gerar dados que exercitem todas os comandos dos cdigos fontes analisados;
2 REFERENCIAL TERICO
Short: O tipo short suporta inteiros de 2 bytes (16 bits) e pode armazenar inteiros
entre -32.768 a 32.767.
Int: O tipo int o tipo de dado mais comum. Suporta inteiros de 4 bytes (32 bits)
e pode armazenar inteiros entre -2.147.483.648 e 2.147.483.647.
Long: O tipo long o tipo de dado com maior alcance entre os inteiros. Suporta
inteiros de 8 bytes (64 bits) e pode armazenar inteiros entre -9.22E+18 (exatos
-9.223.372.036.854.775.808) e 9.22E+18 (exatos 9.223.372.036.854.775.807).
Float: O tipo float o tipo mais comum de dado para nmero decimal. Su-
porta nmeros de 4 bytes (32 bits) e pode armazenar nmeros entre 1.4E-45 e
3.4028235E+38.
Defeito (bug), o resultado de um erro no cdigo que se executado gera uma ano-
malia no funcionamento do mesmo.
13
Uma estratgia de testes de software um roteiro bem definido que integra tcnicas de
projeto de casos de teste e descreve os estgios a serem abordados (unidade, integrao,
sistema e aceitao) e seus respectivos objetivos e atividades. Um template de software
definido serve como um guia nas execues de testes (PRESSMAN, 2006). Este roteiro
serve como uma ferramenta de ganho de resultado durante o processo de desenvolvimento
de software.
As estratgias de testes possuem as seguintes classificaes: teste de unidade, teste de
integrao e teste de sistema. Neste presente trabalho a estratgia analisada a de teste
de unidade. Para maior compreenso, as estratgias esto descritas conforme segue:
Teste de aceitao: fase no qual o teste conduzido pelo cliente, geralmente os testes
so realizados por um grupo de usurios finais do sistema que simulam operaes
de rotina. O principal objetivo verificar se os critrios de validao previamente
estabelecidos esto corretos. Existem duas estratgias comuns para implementar
um teste de aceitao conforme descritas abaixo:
Algorithm 1: Diviso
1: a = 5;
2: b = 0;
3: c = 0;
Algoritmo 1 4: if condio then
5: b = 1;
6: end if
7: c = a/b;
3 METODOLOGIA
4 DATAGEN
Requisitos Funcionais
RF05 - A ferramenta deve gerar para cada arquivo derivado uma srie de valores
de entrada.
4.5 Heurstica
2. Criao das classes Java: Para cada mtodo identificado no passo anterior, uma
classe java no diretrio classeGeradas criada. Cada classe gerada contm alm
de um dos mtodos do arquivo de entrada, os imports das bibliotecas, as variveis
globais, um vetor boleano identificado como flag entre outras modificaes e um
mtodo que retorna o nmero de desvios do mtodo identificado com o mesmo
nome da classe.
Durante a criao das classes, cinco modificaes relevantes so realizadas no
arquivo resultante. As modificaes esto listadas abaixo:
Algorithm 2: Classe01
1: import java.util.ArrayList;
2:
3: public class Classe01{
4:
5: int var_global = 0;
6:
7: public static void metodo01(int a, int b){
8: int result = 0;
9: if (a + b > 10) then
10: result = a + b + var_global;
11: end if
12: if (a > b) then
13: result = a;
14: else if (a == 11) then
Classe 1 15: result = a;
16: end if
17: }
18:
19:
20: public static void metodo02(int c){
21: int result = 0;
22: if (c > 1) then
23: result = c + 15;
24: end if
25: if (result > 20) then
26: result = c;
27: end if
28: }
29: }
Fonte: Elaborada pela autora
Algorithm 3: Metodo01
1: import java.util.ArrayList;
2:
3: class Metodo01{
4:
5: int result = 0;
6: int a = 0;
7: int b = 0;
8: int cont = 0;
9: Container container = new Container();
10:
11: public Container metodo01(int a, int b, String[][] matriz){
12: boolean[] flag = new boolean[getContadorDecisoes()];
13: result = 0;
14: container.setVariaveis(matriz, cont, a, b, c);
15: if (a + b > 10) then
16: result = a + b + var_global;
17: f lag[0] = true
18: cont++;
19: container.setVariaveis(matriz, cont, a, b, c);
20: end if
21: cont++;
22: container.setVariaveis(matriz, cont, a, b, c);
23: if (a > b) then
24: result = a;
25: f lag[1] = true
26: cont++;
27: container.setVariaveis(matriz, cont, a, b, c);
28: else if (a == 11) then
29: result = a;
30: f lag[2] = true
31: cont++;
32: container.setVariaveis(matriz, result+, a+, b+);
33: end if
34: return container.setFlag(flag);
35: return container;
36: }
37:
38: public int getContadorDecisoes(){ return 3; }
39:
40: }
Fonte: Elaborada pela autora
Heurstica
Algorithm 4: Heurstica
1: Processa o arquivo de entrada
2: Gera classes modificadas no diretrio
3: Preenche o vetor de classes.size classes com o caminho no diretrio das classes
4: vertices_possiveis = arvoreBinaria.quantidadeV ertices();
5: for i = 1 to classes.size do
6: Instancia rvoreBinria
7: Instancia TabelaDesvios
8: Instancia TabelaDados
9: for j = 1 to 5 do
10: Gera valores aleatrios para cada argumento
11: Invoca o mtodo da classe corrente com os valores gerados por parmetro
12: Atualiza rvoreBinria
13: Atualiza TabelaDesvios
14: Atualiza TabelaDados
15: Calcula Cobertura de Desvio
16: end for
17: if !condiesParada then
18: for j = 1 to vertices_possiveis do
19: if existePossibilidadeGerao() then
20: Gera valores aleatrios para cada argumento
21: Invoca o mtodo da classe corrente com os valores gerados por
parmetro
22: end if
23: Atualiza rvoreBinria
24: Atualiza TabelaDesvios
25: Atualiza TabelaDados
26: Calcula a diferena entre os valores gerados e os retornados
27: dif erenca = TabelaDados.diferenca(aleatorios, TabelaDados.valores);
28: tipo_operador = tipoOperador(desvio);
29: while existePossibilidadeGerao() and !condiesParada() do
30: f lag_desvio = tipoCondio();
31: if f lag_desvio then
32: if tipo_operador.operadorRelacional() then
33: if tipoOperao(tipo_operador, <, <=) then
34: TabelaDados.ladoDireitoSoma(diferenca);
35: TabelaDados.ladoEsquerdoSubstrai(diferenca);
36: else if tipoOperao(tipo_operador, >, >=) then
37: TabelaDados.ladoEsquerdoSoma(diferenca);
38: TabelaDados.ladoDireitoSubstrai(diferenca);
39: end if
40: else if tipo_operador.operadorIgualdade() then
41: if tipoOperao(tipo_operador, ==) then
42: TabelaDados.iguala(ladoEsquerdo, ladoDireto);
43: else if tipoOperao(tipo_operador, !=) then
44: TabelaDados.difere(ladoEsquerdo, ladoDireto);
45: end if
46: end if
47: end if
48: Invoca o mtodo da classe corrente com os valores da tabela por
parmetro
49: Atualiza TabelaDados
50: Calcula Cobertura de Desvio
51: end while
52: end for
53: end if
54: end for
Fonte: Elaborado pela autora
29
P
posies da tabela de desvio atualizadas
cobertura de desvio = P (4.1)
posies da tabela de desvio
30
CoberturaDesvios: responsvel pela criao, escrita dos arquivos .java e pelo cl-
culo da cobertura de desvios.
Engine: responsvel pelas chamadas das demais classes e por efetuar as principais
operaes do problema proposto, tais como: processamento de arquivo, extrao
de dados da classe, inicializao de dados, operaes aritmticas e relacionais e
chamada do mtodo com variaes dos dados.
A taxa de mutao foi definida aps sucessivos testes, os resultados dos testes para
encontrar a taxa de mutao encontram-se descritos no Apndice A.
As seguintes condies de parada foram definidas:
Algoritmo Gentico
Algorithm 5: Algoritmo Gentico
1: Seja S(t) a populao de cromossomos na gerao t
2: t0
3: inicializar S(t)
4: avaliar S(t)
5: enquanto os critrios de parada no forem satisfeitos faa
6: t t+ 1
7: selecionar S(t) a partir de S(t - 1)
8: aplicar mutao sobre S(t)
9: avaliar S(t)
10: fim enquanto
Fonte: (LACERDA E. G. M; CARVALHO, 1999)
A abordagem de gerao de dados pseudoaleatria tem grande valor prtico por gerar
dados prximos aos utilizados operacionalmente, sendo uma tcnica relativamente menos
custosa que as demais abordagens.
O seguinte critrio foi definido na implementao desta abordagem:
Os algoritmos foram dividos em dois grandes grupos, no primeiro grupo esto presentes
os algoritmos que no contm condies aninhadas e no segundo grupo esto contidos os
algoritmos que possuem ao menos uma condio de desvio aninhada.
Desvio condicional aninhado um desvio que est contido dentro de outro desvio, isto
significa que quando uma desvio executado, ainda possvel estabelecer novas condies.
Este tipo de estrutura pode ter diversos nveis, sendo chamados de condies aninhadas.
Algorithm 7: Desvios aninhados
1: a = 5;
2: if condio01 then
3: a = 1;
4: if condio02 then
5: a = 2;
6: end if
7: end if
Fonte: Elaborada pela autora
A terceira coluna da Tabela 4 exibe a quantidade total de desvios presentes nos algo-
ritmos e a quarta tabela exibe a quantidade de desvios aninhados dentre a quantidade de
desvios totais. Os dois ltimos algoritmos possuem caminhos no executveis.
5.3 Resultados
Nesta seo os resultados obtidos para este trabalho so expostos e comentados. Todos
os resultados apresentados so valores mdios de cinco execues dos algoritmos apresen-
tados nas tabelas 3 e 4. Na seo 5.1 esto os resultados referentes a cobertura de desvio
alcanada utilizando os algoritmos sem desvios aninhados descritos nas tabela 3. A seo
5.2 contm os resultados obtidos utilizando algoritmos com desvios aninhados descitos na
Tabela 4. Os resultados de cada execuo das abordagens encontram-se no Apndice B.
Os primeiros testes foram realizados com o objetivo de determinar qual a melhor taxa
de mutao a ser utilizada. Para isso, foram realizados testes variando-se a taxa entre 0.1
e 1, com intervalo de 0.1, e medindo-se a cobertura de desvio encontrada. Os dados das
execues encontram-se no Apndice A.
39
Como possvel ver no grfico da Figura 15, o algoritmo gentico apresentou resultados
superiores aos das demais abordagens. Com exceo do primeiro teste descrito na Tabela
3, a gerao de dados de teste com algoritmo aleatrio resultou na menor cobertura de
desvios em todos os casos. Nos demais algoritmos de testes, a maior porcentagem de
cobertura de dados de teste variou entre a abordagem que utiliza AG e a heurstica.
40
6 CONCLUSO
O objetivo principal deste trabalho foi propor uma heurstica para a gerao automa-
tizada de dados de teste e anlise de cobertura. Para tal, foi desenvolvida uma heurstica
implementada em uma ferramenta denominada DataGen na linguagem de programao
Java. A anlise da cobertura de desvio foi comparada com duas das abordagens mais
presentes na literatura.
Atravs dos resultados obtidos, foi possvel perceber que a cobertura de desvios da
heurstica superior a cobertura de desvios das demais abordagens. No h grande
diferena entre a heurstica e a abordagem gentica na gerao de dados de testes em
algoritmos sem desvios condicionais. No entanto, entre os testes com desvios aninhados,
a heurstica apresentada resultou em uma cobertura 11% superior a abordagem gentica
e 27% a abordagem aleatria. Em todos os casos, os testes com a abordagem de gerao
aleatria apresentou resultados inferiores.
Analisando os algoritmos, esta diferena entre a porcentagem da cobertura de desvios
justificada em razo da no referncia direta ao cdigo das abordagens gentica e ale-
atria. Ainda, existem outras duas caractersticas intrnsecas abordagem gentica que
influenciam a cobertura de desvios, so elas: alto nmero de possibilidades de configura-
o; alto nmero de avaliaes da funo de aptido e a dificuldade em se determinar o
timo.
Como sugestes para trabalhos futuros:
ALI, Shaukat et al. A systematic review of the application and empirical investigation
of search-based test case generation. IEEE Trans. Software Eng., v. 36, n. 6, p.
742762, 2010. Disponvel em: <http://dblp.uni-trier.de/db/journals/tse/tse36.html#
AliBHP10>.
BEIZER, Boris. Software Testing Techniques (2Nd Ed.). New York, NY, USA: Van
Nostrand Reinhold Co., 1990. ISBN 0-442-20672-0.
CROSS, S. Expert system assisted test data generation for software branch coverage.
Data & Knowledge Engineering, n. 6, Jun 1991.
GLASS, R. L. Software Quality Building. [S.l.]: Prentice Hall (October 11, 1991),
1992. 412 p.
HOWDEN, W.E. Methodology for the generation of program test data. Computers,
IEEE Transactions on, C-24, n. 5, p. 554560, May 1975. ISSN 0018-9340.
MCMINN, Phil. Search-based software test data generation: A survey. Software Tes-
ting, Verification and Reliability, v. 14, n. 2, p. 105156, June 2004. Disponvel em:
<http://philmcminn.staff.shef.ac.uk/publications/pdfs/2004-stvr.pdf>.
MYERS, Glenford J.; SANDLER, Corey. The Art of Software Testing. [S.l.]: John
Wiley & Sons, 2004. ISBN 0471469122.
ORACLE. THE JAVA TUTORIALS, The Reflection API. 2010. Disponvel em:
<http://docs.oracle.com/javase/tutorial/reflect/index.html>.
TSE, T. H. et al. The application of prolog to structured design. Softw. Pract. Exper.,
John Wiley & Sons, Inc., New York, NY, USA, v. 24, n. 7, p. 659676, jul. 1994. ISSN
0038-0644. Disponvel em: <http://dx.doi.org/10.1002/spe.4380240705>.
45
A TAXA DE MUTAO
Neste apndice encontram-se as anlises estatsticas dos dados coletados para a de-
finio da taxa de mutao do algoritmo gentico descrito na seo Anlise da Cobertura
de Desvio e Comparaes deste trabalho.
47