Introdução Teste • Conjunto de atividades e técnicas relacionadas com a procura de erros em um programa 2 Teste • Conjunto de atividades e técnicas relacionadas com a procura de erros em um programa Testes procura erros em conjunto de possíveis execuções do programa. 3 Teste em Perspectiva • Prova de teorema – Prova propriedades complexas, mas requer muito esforço humano. • Análise estática – Prova propriedades simples; pode apresentar alarmes falso. Mas é automático. • Teste – Não prova corretude e não é inteiramente automático! 4 Limitações de Prova de Teorema • Requer conhecimento de um expert • Processo manual – tedioso e passível de erro 5 Limitações de Análise Estática • Provar propriedades de forma automática é, em geral, indecidível! • Eficaz apenas quando – Propriedades de verificação são simples • Variáveis não inicializadas, erros de tipo, etc. – Programas (/ modelos) são simples • Ausência de loop e recursão, ausência de heap, etc. 6 Citação de Dijkstra • “Testing can never demonstrate the absence of errors in software, only their presence.” -- E.W.Dijkstra 7 Citação de Dijkstra • “Testing can never demonstrate the absence of errors in software, only their presence.” -- E.W.Dijkstra Principal limitação de testes é incompletude: é possível que teste não encontre um erro latente. 8 Testes é incompleto, porém... • Rápida implantação • Documenta intenções e designs • Capaz de encontrar erros complexos em programas complexos – Erros complexos: memory leak, deadlock – Programas complexos: 9 Definição: Teste (artefato) • “A set of test inputs, execution conditions, and expected results developed for a particular objective, such as to exercise a particular program path or to verify compliance with a specific requirement” [IEEE, do178b] Definição: Teste (artefato) • “A set of test inputs, execution conditions, and expected results developed for a particular objective, such as to exercise a particular program path or to verify compliance with a specific requirement” [IEEE, do178b] Exemplo public class Customer { String getName() {…} } public class Bank{ static Bank createBank() {…} Customer createCustomer(String name) {…} } Exemplo public class Customer { String getName() {…} } public class Bank{ static Bank createBank() {…} Customer createCustomer(String name) {…} } Bank bank = Bank.createBank(); String name = “customer1“; Customer cust = bank.createCustomer(name); Assert.assertEquals(name, cust.getName()); Exemplo public class Customer { String getName() {…} } public class Bank{ static Bank createBank() {…} Customer createCustomer(String name) {…} } Entrada e resultado esperado: Bank bank = Bank.createBank(); String name = “customer1“; Customer cust = bank.createCustomer(name); Assert.assertEquals(name, cust.getName()); Exemplo public class Customer { String getName() {…} } public class Bank{ static Bank createBank() {…} Customer createCustomer(String name) {…} Customer search(String name) {…} } Condições de execução: Bank bank = Bank.createBank(); String name = “customer1“; Customer cust = bank.search(name); if (cust == null) { Customer cust = bank.createCustomer(name); Assert.assertEquals(name, cust.getName()); } Terminologia: Falta e Falha • IEEE STD. 982.2-1988 (http://standards.ieee.org/) – Fault (falta, bug ou defeito): problema – Failure (falha, ou erro): manifestação do problema • Mais detalhes… – Software Metrics and Reliability [Rosenberg et al., ISSRE’98] Quiz: Localize falta e falha // pre condicao: v != null public static void sort(int[] v) { for (int i = 0; i <= v.length; i++) { …v[i] … } } Quiz: Localize falta e falha // pre condicao: v != null public static void sort(int[] v) { for (int i = 0; i <= v.length; i++) { …v[i] … } defeito } manifestação do defeito Teste e Depuração Teste é atividade de localizar falhas! Depuração é atividade de localizar faltas! Teste e Depuração são atividades complementares Teste e Depuração Teste é atividade de localizar falhas! Depuração é atividade de localizar faltas! No exemplo anterior: Atividade de teste localiza erro no uso de v[i] no corpo do loop de sort. Depuração localiza o defeito na condição de parada do loop i <= v.length Teste de sort public class SortTest{ public static void main(String[] args) { sort(new int[]{}); } } Terminologia: suíte e regressão • Suíte de testes é o mesmo que conjunto de testes • Regressão é o evento de uma falha em um teste que costumava passar Rodar continuamente a suíte de regressão ajuda a antecipar correção de bugs! Alguns dados estatísticos (1) • Beizer [1990] estimou que testes toma 30% a 90% do custo de desenvolvimento • Santhanan and Hailpern [2002] relata que de 50 a 75% do custo de desenvolvimento envolve teste e depuração 23 Alguns dados estatísticos (2) • O instituto americano de padrões e tecnologia (NIST) [2002] estima que $59.2bi é o custo da infra-estrutura inadequada de teste. 24 Resumo desta aula • Perspectiva – Provar corretude ou encontrar erros? • Alguma terminologia – Caso de teste, suíte de teste, regressão, falha, defeitos, depuração, etc. • Dados estatísticos sobre a área 25 Enquete • • • • ant make JUnit3 JUnit4 26