Upload
igor-ponte
View
226
Download
0
Embed Size (px)
Citation preview
Teste de Software15: Geração randômica de teste
Marcelo d’[email protected]
Problema
• Espaço de estados da aplicação é enorme– Muitas operações– Muitos dados
• Que sequência de operações escolher?• Que dado construir?
Teste Randômico
• Constrói sequência e dados tomando decisões randômicas
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
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;
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
Generalização
• Gera-se dados recursivamente, baseado na definição de tipo– Passo 1: Gerar átomos– Passo 2: Gerar objetos estruturados
Outro exemplo: Tipos estruturados
datatype inttree = empty | node of int * inttree * inttree;
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
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
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!
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
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
Teste randômico de programas OO
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
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)
Feedback-directed random test generation. Carlos Pacheco et al., ICSE 2007
Feedback-directed random test generation. Carlos Pacheco et al., ICSE 2007
randomSeqsAndVals:
Feedback-directed random test generation. Carlos Pacheco et al., ICSE 2007
extend: