Testes Alfredo Goldman Baseado em: The Practice of Programming Kernighan & Pie.

Slides:



Advertisements
Apresentações semelhantes
Programação em Java Prof. Maurício Braga
Advertisements

Técnicas de Otimização I
Um programa em C Bibliotecas Variáveis globais
Estruturas de Repetição
Linguagem C Marco Reis.
Manipulação de Strings Marco Reis. Novo arquivo Adicione ManipulacaoDeStrings.c ao projeto. Cada projeto pode ter apenas um método main. Como outros programas.
Programação para Engenharia I
Programação Básica em Java
Pesquisa em Árvores Digitais
Prof. Luis Otavio Alvares
LPG - I: Ponteiros e Vetores/Matrizes UDESC - SBS
LINGUAGEM C Centro Federal de Educação Tecnológica da Paraíba Coordenação de Informática Professor: Lafayette B. Melo.
Testes Prof. Dr. Alfredo Goldman Prof. Dr. Fabio Kon
Linguagem C Strings.
Vetores, Matrizes e Funções
Estruturas de Dados Homogêneas Unidimensionais – Vetores e Strings
Linguagem C Estruturas de Seleção.
Linguagem C Strings.
Modularização: funções e procedimentos
Segurança em Aplicações 5. Melhores Práticas de Programação
Revisão da Linguagem C.
1 Testes Prof. Dr. Alfredo Goldman Prof. Dr. Fabio Kon Departamento de Ciência da Computação IME / USP Treinamento ALESP - 16/03/2005.
Especialização em Segurança da Informação Segurança em Aplicações 5. Melhores Práticas de Programação Márcio Aurélio Ribeiro Moreira
Linguagem de Montagem.
PROGRAMAÇÃO ESTRUTURADA II
Denise Guliato Faculdade de Computação – UFU
Ordenação e Pesquisa de Dados Marco Antonio Montebello Júnior
CADEIA DE CARACTERES (Strings)
Estrutura de dados II Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação
Seminário 1: Revisão de C
DAVID ANDERSON CARDOSO DANTAS
Denise Guliato Faculdade de Computação – UFU
Aula Prática 12 Operações com Arquivos Monitoria
Prof. Ricardo Santos PONTEIROS
Computação Eletrônica
Vetor Prof. Guilherme Baião S. Silva Adaptações:
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014.
Aulas 2 e 3 – Java – Prof. Marcelo Heitor # O método main e argumentos na linha de comando; # Fluxo padrão de entrada e saída; # A classe JOptionPane;
Introdução à Linguagem C
Aula prática 2 Operadores e Expressões Comandos de Decisão Comentários
Programação e Aplicações Gráficas
Operações com Arquivos Monitoria A estrutura FILE  É como um tipo de dado, mas não é um tipo propriamente dito  Definido no arquivo cabeçalho.
Estruturas de Dados Aula 6: Cadeias de Caracteres
STRINGS Dilvan Moreira (baseado no livro Big Java e Z. Liang)
Programação de Computadores I – Arquivos
Aula Prática 1 Monitoria IP/CC (~if669) (A partir do slide elaborado por Luís Gabriel)
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação Versão: _01.
Copyright 2000, Departamento de Informática, UFPE. Todos os direitos reservados sob a legislação em vigor. Orientação a Objetos e Java.
 2000 Prentice Hall, Inc. All rights reserved. 1 Capítulo 8 - Caracteres e Strings Sumário 8.1Introdução 8.2Conceitos Fundamentais de Strings e Caracteres.
1 Testes e sua relação com métodos ágeis Prof. Dr. Fabio Kon Departamento de Ciência da Computação IME / USP JIM ’ São Lu í s, MA Copyleft AgilCoop.
Programação Computacional Aula 8: Entrada e Saída pelo Console Prof a. Madeleine Medrano
Programação Computacional Aula 9: Meu primeiro programa em C
© Copyright 2008 Algoritmos e Estruturas de Dados 1 IF672 - Algoritmos e Estruturas de Dados CIn - UFPE Adriana Libório Fernandes Lins Arthur Cavalcanti.
JAVASCRIPT Programação Web. O que é  E uma linguagem interpretada que e executada na maquina do cliente  Não esta associada ao framework java  Não.
Linguaguem de Programação II
Shell Script Parte 2.
Estruturas Homogêneas – Vetores e Matrizes
Programação para Web I AULA 4 ESTRUTURAS DE CONTROLE.
11 Revisão da Linguagem C Prof. Kariston Pereira Adaptado de Material gentilmente fornecido pelo Prof. Rui Tramontin (DCC/UDESC)
Linguagem de Programação
USP – ICMC – SSC SSC0300 2º Semestre 2015 Disciplina de Linguagem de Programação e Aplicações [ Eng. Elétrica / Eletrônica ] 1 Prof. Dr. Daniel Rodrigo.
PCI- Vetores Profa. Mercedes Gonzales Márquez. Aula 5 - VetoresAlgoritmos e Estruturas de Dados I Sequência de valores todos do mesmo tipo Nome único.
Alocação Dinâmica Dilvan Moreira. Objetivos  Entender o que são e como usar:  Gerenciamento de Memória  Alocação Dinâmica em C.
1 Aula 07 Strings Prof. Filipe Mutz. 2 Em nossos programas ainda não vimos como armazenar palavras e textos, e eles são muito importantes! Exemplos: Programas.
Ambientação com a Sintaxe de Java: parte 2 Prof. Gustavo Wagner Slides Originais: Prof. Tiago Massoni Desenvolvimento de Sistemas FATEC-PB  Centro de.
Fundamentos de Programação 1 Slides 18 Prof. SIMÃO Jean Marcelo SIMÃO Linguagem C “Arquivos Seqüências ou de Texto ”. 1.
Testes Alfredo Goldman Baseado em: The Practice of Programming
Testes Prof. Dr. Alfredo Goldman Prof. Dr. Fabio Kon
Transcrição da apresentação:

Testes Alfredo Goldman Baseado em: The Practice of Programming Kernighan & Pie

Testas  Depurar zSimplificando yDepurar - o que se faz quando se sabe que o programa não funciona; yTeste - tentativas sistemáticas de encontrar erros em programa que você “acha” que está funcionando. z“Testes podem mostrar a presença de erros, não a sua ausência (Dijkstra)”

Teste enquanto você escreve código zSe possível escreva os testes antes mesmo de escrever o código yuma das técnicas de XP zquanto antes for encontrado o erro melhor !!

Técnicas básicas zTeste o código em seus limites; zTeste de pré e pós condições; zUso de premissas (assert); zPrograme defensivamente; zUse os códigos de erro.

Teste o código em seus limites zPara cada pequeno trecho de código (um laço, ou if por exemplo) verifique o seu bom funcionamento; zTente ume entrada vazia, um único item, um vetor cheio, etc.

Exemplo: int i; char s[MAX]; for(i=0; s[i] = getchar() != ‘\n’ && i < MAX - 1; i++); s[--i]=‘\0’; Primeiro erro fácil: // o = tem precedência menor do que o != for(i=0; (s[i] = getchar()) != ‘\n’ && i < MAX - 1; i++);

Exemplo: int i; char s[MAX]; for(i=0; i < MAX - 1; i++) if (s[i] = getchar()) == ‘\n’) break; s[i]=‘\0’; Testes: linha vazia ok; 1 caracter ok; 2 caracteres ok; MAX caracteres ok e se o primeiro caracter já é o de fim de arquivo ?

Exemplo: int i; char s[MAX]; for(i=0; i < MAX - 1; i++) if (s[i] = getchar()) == ‘\n’ || s[i]==EOF) break; s[i]=‘\0’; Testes: ok. Mas quê se deve fazer se a string s fica cheia antes do ‘\n’ Depende, estes caracteres são necessários, ou não ?

Teste de pré e pós condições zVerificar certas propriedades antes e depois de trechos de código double avg(double a[], int n){ int i; double sum = 0.0; for(i = 0; i < n; i++) sum += a[i]; return sum / n; }

Teste de pré e pós condições zSolução possível zNão existe uma única resposta certa yA única resposta claramente errada é ignorar o erro !! yEx: USS Yorktown. // mudar o return return n <= 0 ? 0.0 : sum / n;

Uso de premissas zEm C e C++ use yex: assert (n>0); yse a condição for violadada: Assertion failed: n>0, file avgtest.c, line 7. zAjuda a identificar “culpados” pelos erros

Programação defensiva zTratar situações que não “podem” acontecer Exemplo: if (nota 10) // não pode acontecer letra = ‘?’; else if (nota > 9) letra = ‘A’; else...

Utilizar códigos de erro zChecar os códigos de erro de funções e métodos; yvocê sabia que o scanf retorna o número de parâmetros lidos, ou EOF ? zSempre verificar se ocorreram erros ao abrir, ler, escrever e principalmente fechar arquivos. zEm java sempre tratar as possíveis exceções

Exemplos / exercícios: int fatorial( int n){ int fac = 1; while (n--) { fac *= n; } return fac; }

Exemplos / exercícios: i = 0; do { putchar(s[i++]); putchar(‘\n’); } while (s[i] != 0); Imprimir caracteres, um por linha

Exemplos / exercícios: void strcpy( char *dest, char *src) { int i; for( i = 0; src[i] != ‘\0’; i++) { dest[i] = src[i]; } Copia uma string de src a dest

Exemplos / exercícios: void strcpy( char *d, char *s, int n) { while (n > 0 && *s != ‘\0’){ *t = *s; t++; s++; n--; } Copia até n caracteres de uma string de s a d

Exemplos / exercícios: if (i > j) printf(``%d e maior que %d.\n’’, i, j); else printf(``%d e menor que %d.\n’’, i, j); Uma comparação

Exemplos / exercícios: if (c >= `A’ && c <= `Z’) { if (c <= `L’) cout << ``first half of alphabet’’; else cout << ``second half of alphabet’’; Um programa simples com caracteres

Exemplos / exercícios: 1) com que datas você checaria se um programa passaria pelo bug do milênio ? 2) se os testes fossem caros o que você testaria após 1/1/2000 ? 3) que outros erros relacionados você consegue imaginar ?

Testes sistemáticos (1/4) zTeste incrementalmente ydurante a construção do sistema xapós testar dois pacotes independentemente teste se eles funcionam juntos zTeste primeiro partes simples ytenha certeza que partes básicas funcionam antes de prosseguir ytestes simples encontram erros simples yteste as funções/métodos individualmente xEx: teste de função que faz a busca binária em inteiros

Testes Sistemáticos (2/4) zConheça as saídas esperadas yconheça a resposta certa ypara programas mais complexos valide a saída com exemplos conhecidos xcompiladores - arquivos de teste; xnuméricos - exemplos conhecidos, características; xgráficos - exemplos, não confie apenas nos seus olhos.

Testes Sistemáticos (3/4) zVerifique as propriedades invariantes yalguns programas mantém propriedades da entrada xnúmero de linha xtamanho da entrada xfreqüência de caracteres Ex: a qualquer instante o número de elementos em uma estrutura de dados deve ser igual ao número de inserções menos o número de remoções.

Testes Sistemáticos (3/4) #include unsigned long count[UCHAR_MAX+1]; int main(void) { int c; while ((c = getchar()) != EOF){ count[c]++; } for(c=0; c <= UCHAR_MAX; c++){ printf(``%.2x %c %lu\n’’, c, isprint(c) ? c: `-’, count[c]); return 0; } 1) Como melhorar e testar o programa acima ? 2) Como proceder no caso de outros tipos de dados de 32bits. Faça uma versão do programa que trate estes dados de maneira elegante.

Testes Sistemáticos (4/4) zCompare implementações independentes yos resultados devem ser os mesmos xse forem diferentes pelo menos uma das implementações está incorreta zCobertura dos testes ycada comando do programa deve ser executado por algum teste xexistem profilers que indicam a cobertura de testes

Automação de testes zTestes manuais ytedioso, não confiável zTestes automatizados ydevem ser facilmente executáveis xjunte em um script todos os testes

Automação de testes zTeste de regressão automáticos yComparar a nova versão com a antiga yverificar se os erros da versão antiga foram corrigidos yverificar que novos erros não foram criados zTestes devem rodar de maneira silenciosa yse tudo estiver ok

Automação de testes Exemplo de script: for i in Ka_data.* # laço sobre os testes do old_ka $i > out1 # versao antiga new_ka $i > out2 # nova versao if !cmp -s out1 out2# compara then echo $i: Erro # imprime mensagem fi done

Automação de testes zCrie testes autocontidos ytestes que contém suas próprias entradas e respectivas saídas esperadas yprogramas tipo awk podem ajudar zO quê fazer quando um erro é encontrado yse não foi encontrado por um teste xfaça um teste que o provoque zComo fazer um testador automático para o programa de freqüência ?

Framework de testes zAs vezes para se testar um componente isoladamente é necessários criar um ambiente com características de onde este componente será executado  ex: testar funções mem* do C (como memset )

Framework de testes /* memset: set the first n bytes of s to the byte c */ void *memset(void *s, int c, size_t n) { size_t i; char *p; p = (char *) s; for (i=0; i<n; i++) p[i] = c; return s; } // memset(s0 + offset, c, n); // memset2(s1 + offset, c, n); // compare s0 e s1 byte a byte Como testar funções do math.h ?

Testes de stress zTestar com grandes quantidades de dados ygerados automaticamente yerros comuns: xoverflow nos buffers de entrada, vetores e contadores yExemplo: ataques de segurança  gets do C - não limita o tamanho da entrada  o scanf(``%s’’, str) também não... xErro conhecido por “buffer overflow error” NYT98

Testes de stress Exemplos de erros que podem ser encontrados: char *p; p = (char *) malloc (x * y * z); Conversão entre tipos diferentes: Ariane 5 conversão de double de 64 bits em int de 16 bits => BOOM

Dicas para fazer testes zCheque os limites dos vetores ycaso a linguagem não faça isto por você yfaça com que o tamanho dos vetores seja pequeno; ao invés de criar testes muito grandes zFaça funções de hashing constantes zCrie versões de malloc que ocasionalmente falham zDesligue todos os testes antes de lançar a versão final

Dicas para fazer testes zInicialize os vetores e variáveis com um valor não nulo yex: 0xDEADBEEF pode ser facilmente encontrado zNão continue a implementação de novas características se já foram encontrados erros zTeste em várias máquinas, compiladores e SOs

Tipos de teste z“white box” ytestes feitos por quem conhece (escreveu) o código z“black box” ytestes sem conhecer o código z“usuários” yencontram novos erros pois usam o programa de formas que não foram previstas

Lembre-se zPor que não escrever testes yestou com pressa zQuanto maior a pressão ymenos testes zCom menos testes ymenos produtividade e menor estabilidade zLogo, a pressão aumenta....

O único conceito mais importante de testes é DO IT