Teste de Software 15: Geração randômica de teste Marcelo d’Amorim [email protected].
-
Upload
igor-ponte -
Category
Documents
-
view
226 -
download
0
Transcript of Teste de Software 15: Geração randômica de teste Marcelo d’Amorim [email protected].
![Page 2: Teste de Software 15: Geração randômica de teste Marcelo d’Amorim damorim@cin.ufpe.br.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570638471a28abb8238f3ba7/html5/thumbnails/2.jpg)
Problema
• Espaço de estados da aplicação é enorme– Muitas operações– Muitos dados
• Que sequência de operações escolher?• Que dado construir?
![Page 3: Teste de Software 15: Geração randômica de teste Marcelo d’Amorim damorim@cin.ufpe.br.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570638471a28abb8238f3ba7/html5/thumbnails/3.jpg)
Teste Randômico
• Constrói sequência e dados tomando decisões randômicas
![Page 4: Teste de Software 15: Geração randômica de teste Marcelo d’Amorim damorim@cin.ufpe.br.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570638471a28abb8238f3ba7/html5/thumbnails/4.jpg)
Teste Randômico
• Mostrou sucesso em vários casos– Ideal: explorar espaço de estados de forma
uniforme (dependendo do gerador aleatório)
Caminhos de um programa
![Page 5: Teste de Software 15: Geração randômica de teste Marcelo d’Amorim damorim@cin.ufpe.br.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570638471a28abb8238f3ba7/html5/thumbnails/5.jpg)
Exemplo: ling. funcional• Como gerar dados para a função ML split?
local fun split_iter (x::xs, left, right) = split_iter(xs, right, x::left) | split_iter ([ ], left, right) = (left, right) in fun split(x) = split_iter(x,[ ],[ ]) end;
![Page 6: Teste de Software 15: Geração randômica de teste Marcelo d’Amorim damorim@cin.ufpe.br.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570638471a28abb8238f3ba7/html5/thumbnails/6.jpg)
Exemplo: ling. funcional• Como gerar dados para a função ML split?
local fun split_iter (x::xs, left, right) = split_iter(xs, right, x::left) | split_iter ([ ], left, right) = (left, right) in fun split(x) = split_iter(x,[ ],[ ]) end;
• Assumindo tipo de split: int list => (int list, int list)– primeiro gera-se inteiros e lista vazia, depois listas
mais complexas
![Page 7: Teste de Software 15: Geração randômica de teste Marcelo d’Amorim damorim@cin.ufpe.br.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570638471a28abb8238f3ba7/html5/thumbnails/7.jpg)
Generalização
• Gera-se dados recursivamente, baseado na definição de tipo– Passo 1: Gerar átomos– Passo 2: Gerar objetos estruturados
![Page 8: Teste de Software 15: Geração randômica de teste Marcelo d’Amorim damorim@cin.ufpe.br.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570638471a28abb8238f3ba7/html5/thumbnails/8.jpg)
Outro exemplo: Tipos estruturados
datatype inttree = empty | node of int * inttree * inttree;
![Page 9: Teste de Software 15: Geração randômica de teste Marcelo d’Amorim damorim@cin.ufpe.br.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570638471a28abb8238f3ba7/html5/thumbnails/9.jpg)
Passo 1: Gerar átomosint inttree
-5, -2, 0, 2, 5 e
Usa-se construtores elementares:datatype inttree = empty | node of int * inttree * inttree;
e = empty
![Page 10: Teste de Software 15: Geração randômica de teste Marcelo d’Amorim damorim@cin.ufpe.br.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570638471a28abb8238f3ba7/html5/thumbnails/10.jpg)
Passo 1: Gerar objetos estruturados
int inttree
-5, -2, 0, 2, 5 e, (-2,e,e), (5,e,e)
Usa-se construtores elementares:datatype inttree = empty | node of int * inttree * inttree;
Iteração 1
![Page 11: Teste de Software 15: Geração randômica de teste Marcelo d’Amorim damorim@cin.ufpe.br.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570638471a28abb8238f3ba7/html5/thumbnails/11.jpg)
Passo 1: Gerar objetos estruturados
int inttree
-5, -2, 0, 2, 5 e, (-2,e,e), (5,e,e), (0, (-2,e,e),e), (0,e, (5,e,e)), (0, (-2,e,e), (5,e,e))
Usa-se construtores elementares:datatype inttree = empty | node of int * inttree * inttree;
Iteração 2
cópias!
![Page 12: Teste de Software 15: Geração randômica de teste Marcelo d’Amorim damorim@cin.ufpe.br.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570638471a28abb8238f3ba7/html5/thumbnails/12.jpg)
Limitação
• Não considera invariantes do programa– Exemplos
• Programa com comportamento especial para listas ordenadas de tamanho N
• Programa que aceita apenas árvores com o tamanho da sub-árvore esquera 2x o da direita
![Page 13: Teste de Software 15: Geração randômica de teste Marcelo d’Amorim damorim@cin.ufpe.br.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570638471a28abb8238f3ba7/html5/thumbnails/13.jpg)
Falta de invariantes na geração
• Duas soluções:– Usar código para construir dados
• Código precisa construir valores relevantes – E.g. como testar caso lista ordenada em um algoritmo de
ordenação
– Execução simbólica• Sucesso depende de limitações de um SAT solver
![Page 14: Teste de Software 15: Geração randômica de teste Marcelo d’Amorim damorim@cin.ufpe.br.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570638471a28abb8238f3ba7/html5/thumbnails/14.jpg)
Teste randômico de programas OO
![Page 15: Teste de Software 15: Geração randômica de teste Marcelo d’Amorim damorim@cin.ufpe.br.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570638471a28abb8238f3ba7/html5/thumbnails/15.jpg)
Randoop
• Contratos (Oracles) default– Mas o usuário pode definir os seus
• É necessário definir região para geração!– Teste de unidade
• Aplica redução de suíte– Baseada em equals, null, e exceções– Usuário pode definir seus critérios de filtro
• Não explora particularidade de oo– E.g., polimorfismo
![Page 16: Teste de Software 15: Geração randômica de teste Marcelo d’Amorim damorim@cin.ufpe.br.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570638471a28abb8238f3ba7/html5/thumbnails/16.jpg)
Terminologia
• Randoop gera sequências como estas• Cada sequência gera mais de um valor
– s1.1 (b1), s2.1 (b2), s3.1 e s3.2 (a1 e b3)
![Page 17: Teste de Software 15: Geração randômica de teste Marcelo d’Amorim damorim@cin.ufpe.br.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570638471a28abb8238f3ba7/html5/thumbnails/17.jpg)
Feedback-directed random test generation. Carlos Pacheco et al., ICSE 2007
![Page 18: Teste de Software 15: Geração randômica de teste Marcelo d’Amorim damorim@cin.ufpe.br.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570638471a28abb8238f3ba7/html5/thumbnails/18.jpg)
Feedback-directed random test generation. Carlos Pacheco et al., ICSE 2007
randomSeqsAndVals:
![Page 19: Teste de Software 15: Geração randômica de teste Marcelo d’Amorim damorim@cin.ufpe.br.](https://reader035.fdocument.pub/reader035/viewer/2022062522/570638471a28abb8238f3ba7/html5/thumbnails/19.jpg)
Feedback-directed random test generation. Carlos Pacheco et al., ICSE 2007
extend: