data flow testing. vários critérios de adequação até aqui baseado em entradas de função...

24
Data Flow Testing

Upload: nicolas-borrego

Post on 07-Apr-2016

215 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Data Flow Testing. Vários critérios de adequação até aqui Baseado em entradas de função (funcional) Baseado na estrutura do programa (estrutural) Baseado

Data Flow Testing

Page 2: Data Flow Testing. Vários critérios de adequação até aqui Baseado em entradas de função (funcional) Baseado na estrutura do programa (estrutural) Baseado

Vários critérios de adequação até aqui

Baseado em entradas de função (funcional) Baseado na estrutura do programa (estrutural) Baseado em faltas injetadas (mutação)

Page 3: Data Flow Testing. Vários critérios de adequação até aqui Baseado em entradas de função (funcional) Baseado na estrutura do programa (estrutural) Baseado

Algumas limitações também... Funcional

Inadequado para construir entradas que leva a caminhos específicos do programa

Estrutural Pode gerar muitos caminhos desnecessários (e.g.,

exercitar mesmo loop repetidamente.) Baseado em falhas

Modelo de falhas possivelmente irrealista, alto custo de execução de mutantes, alto custo de identificação de programas equivalentes

Page 4: Data Flow Testing. Vários critérios de adequação até aqui Baseado em entradas de função (funcional) Baseado na estrutura do programa (estrutural) Baseado

Critério baseado em fluxo de dados

Recordar origem de um bug: Falta modifica estado de um programa

incorretamente Falha manifesta-se através da leitura deste

estado Observação

Relação de leitura e escrita entre dados é importante!

Page 5: Data Flow Testing. Vários critérios de adequação até aqui Baseado em entradas de função (funcional) Baseado na estrutura do programa (estrutural) Baseado

Critério baseado em fluxo de dados

Abordagem Suíte deve incluir testes que executam

statements logicamente relacionadosE.g., escrita e posterior leitura de um campo de um objeto devem aparecer em um mesmo teste

Page 6: Data Flow Testing. Vários critérios de adequação até aqui Baseado em entradas de função (funcional) Baseado na estrutura do programa (estrutural) Baseado

DU Pair

Associação de definição e uso de variáveis do programa Neste contexto, uma definição é uma nova

atribuição de valor a uma variável

Page 7: Data Flow Testing. Vários critérios de adequação até aqui Baseado em entradas de função (funcional) Baseado na estrutura do programa (estrutural) Baseado

Exemplo

01: public static int foo(int a) {02: if (a > 10) {03: a++;04: }05: ...06: return a; 07: }

DU pairs: (01,02), (01,03), ...

Assuma que parâmetro define um valor

Page 8: Data Flow Testing. Vários critérios de adequação até aqui Baseado em entradas de função (funcional) Baseado na estrutura do programa (estrutural) Baseado

Exemplo

01: public static int foo(int a) {02: if (a > 10) {03: a++;04: }05: ...// nova definição de a?06: return a; 07: }

DU pairs: (01,02), (01,03), (03,06)?

Linha 05 pode redefinir variável a.

Page 9: Data Flow Testing. Vários critérios de adequação até aqui Baseado em entradas de função (funcional) Baseado na estrutura do programa (estrutural) Baseado

DU Path

Caminho que associa uma definição ao uso de uma variável

Vários DU Paths para um DU Pair E.g.

01: int x = 1;02: if (...) {03: ...04: } else {05: ...07: }08: System.out.println(“x value”+ x);

Page 10: Data Flow Testing. Vários critérios de adequação até aqui Baseado em entradas de função (funcional) Baseado na estrutura do programa (estrutural) Baseado

Cobertura de uma suíte de testes

du pairs: fração de todos os pares du que são cobertos por pelo menos um teste

du paths: fração de todos os caminhos (desconsiderando loop) du que são cobertos por pelo menos um teste

definitions: fração de definições cobertas por pelo menos um teste

Page 11: Data Flow Testing. Vários critérios de adequação até aqui Baseado em entradas de função (funcional) Baseado na estrutura do programa (estrutural) Baseado

Desafios gerais de análises estáticas Abrangência: whole-program analysis, main Profundidade: intraprocedural, interprocedural Características de programas: encapsulamento

de dados, ponteiros e arrays

Page 12: Data Flow Testing. Vários critérios de adequação até aqui Baseado em entradas de função (funcional) Baseado na estrutura do programa (estrutural) Baseado

Interprocedural

public class Sample { int x; public static void main(String[] args){ Sample s = new Sample(); s.x = read(System.in); if (s.x > 10) { s.x--; } s.f(); } public void f() { s.x++; }}

Definição de s.x se propaga até Sample.f

Page 13: Data Flow Testing. Vários critérios de adequação até aqui Baseado em entradas de função (funcional) Baseado na estrutura do programa (estrutural) Baseado

Interprocedural

public class Sample { int x; public static void main(String[] args){ Sample s = new Sample(); s.x = read(System.in); if (s.x > 10) { s.x--; } s.f(); } public void f() { s.x++; }}

Definição de s.x se propaga até Sample.f

Duas definições alcançam a entrada de f

Page 14: Data Flow Testing. Vários critérios de adequação até aqui Baseado em entradas de função (funcional) Baseado na estrutura do programa (estrutural) Baseado

Interprocedural

public class Sample { int x; public static void main(String[] args){ Sample s = new Sample(); s.x = read(System.in); if (s.x > 10) { s.x--; } s.f(); } public void f() { s.x++; }}

Definição de s.x se propaga até Sample.f

Duas definições alcançam a entrada de f

Análise é feita sobre funções alcançáveis a partir de main

Page 15: Data Flow Testing. Vários critérios de adequação até aqui Baseado em entradas de função (funcional) Baseado na estrutura do programa (estrutural) Baseado

Análise a partir de função main

Reduz complexidade da análise estática Muitas funções não são alcançáveis (usadas)

No contexto de testes é útil para medir cobertura Requisitos de teste (cobertura) são construídos a

partir de uma sequência de teste Mas desconsidera vários comportamentos

Page 16: Data Flow Testing. Vários critérios de adequação até aqui Baseado em entradas de função (funcional) Baseado na estrutura do programa (estrutural) Baseado

Análise a partir de função main

Reduz complexidade da análise estática Muitas funções não são alcançáveis (usadas)

No contexto de testes é útil para medir cobertura Requisitos de teste (cobertura) são construídos a

partir de uma sequência de teste Mas desconsidera vários comportamentos

Nota: as vezes, não há uma função main a analisar

Page 17: Data Flow Testing. Vários critérios de adequação até aqui Baseado em entradas de função (funcional) Baseado na estrutura do programa (estrutural) Baseado

Alternativa: construção de contextos

Mas que contextos são esses? (além de main) Heurística para OO: assuma que métodos de uma

classe estão relacionados

Page 18: Data Flow Testing. Vários critérios de adequação até aqui Baseado em entradas de função (funcional) Baseado na estrutura do programa (estrutural) Baseado

Várias funções e encapsulamento

public class Stack<T> { int num; T[] elems; public void push(T t) { num++; elems[num]=t; } public T pop() { elems[num] = null; num--; } public T peek() { return elem[num]; }}

Page 19: Data Flow Testing. Vários critérios de adequação até aqui Baseado em entradas de função (funcional) Baseado na estrutura do programa (estrutural) Baseado

Várias funções e encapsulamento

public class Stack<T> { int num; T[] elems; public void push(T t) { num = num + 1; elems[num]=t; } public T pop() { elems[num] = null; num = num - 1; } public T peek() { return elem[num]; }}

definições e uso

Page 20: Data Flow Testing. Vários critérios de adequação até aqui Baseado em entradas de função (funcional) Baseado na estrutura do programa (estrutural) Baseado

Note que não há função main associando peek, push, e pop.

Page 21: Data Flow Testing. Vários critérios de adequação até aqui Baseado em entradas de função (funcional) Baseado na estrutura do programa (estrutural) Baseado

Encapsulamento de dados

public class Foo { Stack<?> s; public Stack<?> getStack() { return s; } public void foo() {...getStack().peek();...} public void bar(int k) {...getStack().push(k);...}}

public class Stack<T> { int num; T[] elems; public void push(T t) { num++; ... } public T pop() { ... ; num--; } public T peek() { return elem[num]; }}

Foo.foo usa definições construídas em Foo.bar.

Page 22: Data Flow Testing. Vários critérios de adequação até aqui Baseado em entradas de função (funcional) Baseado na estrutura do programa (estrutural) Baseado

Encapsulamento de dados

public class Stack<T> { int num; T[] elems; public void push(T t) { num++; ... } public T pop() { ... ; num--; } public T peek() { return elem[num]; }}

Campo do tipo Stack<?> é estado encapsulado em Foo.

Foo.foo usa definições construídas em Foo.bar.public class Foo {

Stack<?> s; public Stack<?> getStack() { return s; } public void foo() {...getStack().peek();...} public void bar(int k) {...getStack().push(k);...}}

Page 23: Data Flow Testing. Vários critérios de adequação até aqui Baseado em entradas de função (funcional) Baseado na estrutura do programa (estrutural) Baseado

Encapsulamento de dados

public class Foo { Stack<?> s; public Stack<?> getStack() { return s; } public void foo() {...getStack().peek();...} public void bar(int k) {...getStack().push(k);...}}public class Foo2 { Stack<?> s2; public Stack<?> getStack2() { return s2; } public void foo2() {...getStack().peek();...} public void bar2(int k) {...getStack().push(k);...}}

Note, porém, que bar e foo2 (ou bar2 e foo) não estão associados!

Page 24: Data Flow Testing. Vários critérios de adequação até aqui Baseado em entradas de função (funcional) Baseado na estrutura do programa (estrutural) Baseado

Leituras adicionais

Capítulo 13 (Data Flow Testing) do livro “Software Testing and Analysis”

“Efficient Computation of Interprocedural Definition-Use Chains”, M. J. Harrold and M. L. Soffa, ACM TOPLAS 1994

Nota: análise que consideram encapsulamento ainda são poucas!