teste de software 15: geração randômica de teste marcelo d’amorim [email protected]

19
Teste de Software 15: Geração randômica de teste Marcelo d’Amorim [email protected]

Upload: igor-ponte

Post on 07-Apr-2016

237 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Teste de Software 15: Geração randômica de teste Marcelo d’Amorim damorim@cin.ufpe.br

Teste de Software15: Geração randômica de teste

Marcelo d’[email protected]

Page 2: Teste de Software 15: Geração randômica de teste Marcelo d’Amorim damorim@cin.ufpe.br

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Feedback-directed random test generation. Carlos Pacheco et al., ICSE 2007

extend: