Teste Estrutural Teste estrutural • Teste baseado na estrutura do código • Mais precisamente, – Critério de adequação baseia-se no código! 2 Teste estrutural • Estrutura de um programa é um grafo • Exemplos: – Organização em árvore de pacotes e classes – Parser gera uma AST – Fluxo de controle de um método define CFG – Fluxo de chamada de métodos define CG 3 Control-Flow Graph (CFG) stmt0; while (condA){ if (condB){ stmt1; stmt2; } stmt3; } stmt4 4 CFG stmt0; while (condA){ if (condB){ stmt1; stmt2; } stmt3; } stmt4 stmt0 condA condB stmt4 stmt1; stmt2; stmt3 5 Simplificação didática • Testar a estrutura de um programa equivale a testar um grafo • O que é um teste? (Para um grafo) 6 Simplificação didática • Testar a estrutura de um programa equivale a testar um grafo • O que é um teste para um grafo? – Sequência de transiçoes a partir do nó inicial que termina em uma folha 7 Simplificação didática • Testar a estrutura de um programa equivale a testar um grafo Model checkers de programas (ferramentas que geram sistematicamente testes) usam o mesmo princípio. Exemplos: Java PathFinder (Java), Verisoft (C), Spin (Promela). 8 Cobertura de Grafos a stmt0 t0 t4 b condA t1 condB c stmt4 t2 stmt1; stmt2; t6 f t5 d stmt3 t3 e 9 Cobertura de Grafos • Exemplo de teste a – t0, t6 t0 t4 b t1 t6 c t2 f t5 d t3 e 10 10 Critérios de adequação de grafo • Nó • Transição • Caminho 11 Critérios de adequação de grafo • Nó – Teste suíte TS é adequada a nó se para cada nó n no grafo G existe ao menos um teste t em TS que cobre n • Transição • Caminho 12 Critérios de adequação de grafo • Nó – Teste suíte TS é adequada a nó se para cada nó n no grafo G existe ao menos um teste t em TS que cobre n • Transição • Caminho Grafo com ciclo possui número infinito de caminhos 13 Ciclos • Problema: – Como medir cobertura de caminho? • Grafo com ciclos contém infinidade de caminhos • Solução comum: – Limitar o número de iterações! • Transforma um grafo em uma árvore 14 Exercício • • • • Reporte suíte de teste adequada a nó Reporte suíte de teste adequada a transição Existe suíte de teste adequada a caminho? Existe suíte de teste adequada a caminho de a até N transições? t0 t4 t1 t2 b c t6 f t5 d t3 e 15 15 Caminhos inalcançáveis Há caminhos inalcançáveis no programa: não há execução que o visite. 16 Caminhos inalcançáveis if (a < 0) { a = 0; } if (a > 10) { a = 10; } skip(); a < 0 a = 0 a > 10 a = 10 skip 17 Caminhos inalcançáveis • Enumere os caminhos do grafo a < 0 a = 0 a > 10 a = 10 skip 18 Caminhos inalcançáveis • Enumere os caminhos do grafo a < 0 a = 0 a > 10 a = 10 skip 19 Caminhos inalcançáveis • Todos estes caminhos são alcancáveis? if (a < 0) { a = 0; } if (a > 10) { a = 10; } skip(); 20 Caminhos inalcançáveis • Estes caminhos são alcancáveis? if (a < 0) { a = 0; } if (a > 10) { a = 10; } skip(); a < 0 => NOT(a > 10) 21 Lista incompleta de critérios de adequação estruturais para programa • • • • • • • • • • • Statement Basic-Block Branch Basic condition Compound condition MC/DC Path Boundary-Interior Loop boundary Call … 22 Lista incompleta de critérios de adequação estruturais para programa • • • • • • • • • • • Statement Basic-Block Branch Basic condition Compound condition MC/DC Path Boundary-Interior Loop boundary Call … Basic-block subsumes Statement Branch subsumes Basic-block 23 Cobertura baseada em Condições Lógicas • Terminologia – Condições básicas e compostas • Exemplo: (((a || b) && c) || d) && e – a, b, c, d, e são condições básicas – (a || b) é uma condição composta 24 Cobertura baseada em Condições Lógicas • Basic condition – Requer que toda condição básica seja satisfeita pela execução de algum teste • Compound Condition – Requer que toda condição composta seja satisfeita pela execuçao de algum teste • MC/DC – Requer que para cada condição básica C tenham-se 2 casos de teste que fixem o valor de todas as outras condições básicas. Os testes devem variar o resultado de C e o resultado de toda expressão. RTCA/DO-178B, EUROCAE ED-12b 25 MC/DC • Objetivo é isolar efeito de cada condição básica no resultado de toda expressão 26 Exercício • Gerar suíte de teste adequada a (i) basic condition, (ii) compound condition, e (iii) MC/DC para o bloco abaixo { if ((((a || b) && c) || d) && e) {…} else {…} } 27 Solução • ((((a || b) && c) || d) && e) a 0 1 0 0 1 1 0 0 0 0 b 0 0 0 1 0 0 0 0 0 0 c 1 1 1 1 0 1 0 0 0 0 d 0 0 0 0 0 0 0 1 1 1 e 1 1 1 1 1 1 1 1 0 1 T 0 1 0 1 0 1 0 1 0 1 a 0 1 0 0 1 1 0 0 0 0 b 0 0 0 1 0 0 0 0 0 0 c 1 1 1 1 0 1 0 0 0 0 d 0 0 0 0 0 0 0 1 1 1 e 1 1 1 1 1 1 1 1 0 1 T 0 1 0 1 0 1 0 1 0 1 28 Resumo • Várias formas de se medir cobertura de código • Ciclos • Caminhos inalcançáveis 29