introdução a testes de software - federal university of ... · teste de software – cont. •...
TRANSCRIPT
Agenda da Aula
• Introdução sobre Testes;
• Testes Funcionais de software;
• Testes Estruturais de Software;
Teste de Software
• Processo para descobrir a existência de defeitos em um software.
• Um defeito pode ser introduzido em qualquer fase de desenvolvimento ou manutenção como resultado de um ou mais “bugs” – imprecisão, desentendimentos, omissões e direcionamento a soluções particulares, inconsistências, incompletude.
• Debugging – Processo de encontrar bugs associados a um defeito.
• Objetivos:– Mostrar que a aplicação faz o esperado
– Mostrar que a aplicação não faz mais do que o esperado
• Teste é um processo referencial: É necessário existir uma definição precisa do que se quer verificar e quais os resultados esperados.
Teste de Software – Cont.
• Todas as representações de um software podem e devem ser testados.
• Teste não implica em garantia de qualidade: é necessário ter um conjunto de métodos para a prevenção e remoção de defeitos.
• Nenhuma quantidade absurda de testes pode melhorar a qualidade de um software: teste ajuda a identificar problemas que poderíamos ter evitado.
• Garantia de qualidade requer processos além da execução de testes. Entretanto, processos de planejamento e especificação de testes executados mais cedo podem contribuir nesta direção.
Fases de Teste
• As fases de teste são independentes do
paradigma de desenvolvimento de software
utilizado, seja ele procedimental ou orientado a
objetos.
– Teste de Unidade
– Teste de Integração
– Teste de Sistema
– Teste de Aceitação
Características de um bom
Teste
• Um bom teste tem alta probabilidade de
encontrar um erro;
• Um bom teste não é redundante;
• Um bom teste não deve ser muito simples
nem muito complexo;
Técnicas de Testes
• Teste Funcional (Caixa Preta);
• Teste Estrutural(Caixa Branca);
Teste Funcional
Teste Estrutural
Teste Funcional - Definição
• São técnicas de teste que são apenas
consideradas as entradas e as saídas
para verificar se em conformidade com os
objetivos especificados.
Em princípio, o teste
funcional pode detectar
todos os defeitos,
submetendo o programa a
todas as possíveis
entradas (teste
exaustivos).
Se o domínio da entrada
for muito grande pode ser
inviável fazer este teste.
É necessário
utilizar um
critério
Teste Funcional
Critérios Funcionais
• Particionamento de Classes de Equivalência
• Análise do Valor Limite
O testador deverá encontrar um subconjunto de todas as possíveis
entradas do programa e este subconjunto deve ter grande probabilidade de
encontrar defeitos
Teste Funcional
Particionamento de Equivalência
• Para aplicar este critério de teste na
aplicação a ser testada, deve-se seguir o
seguinte roteiro:
1. Estabelecer as classes válidas (valores
permitidos para o atributo) e as inválidas
(valores proibidos), para cada atributo do
software.
2. Gerar casos de teste selecionando um
elemento de cada classe, de forma a ter
o menor número de casos de testes
possível.
Teste Funcional
Variável de
Entrada
Classes de
Equivalência
válidas
Classes de
Equivalência
inválidas
Variáveis
de Entrada
Saída
Esperada
Saída
Obtida
Peso da
Criança (P)
P>0 P<=0 1) 2,4 kg
2) 0 kg
3) -2,5 kg
1) OK
2) ERRO
3) ERRO
1) OK
2) ERRO
3) ERRO
Data de
Nascimento
(DN)
nasc <= sysdate nasc > sysdate 4) 21/03/2014
5) 22/03/2014
6) 23/03/2014
4) OK
5) OK
6) ERRO
4) OK
5) OK
6) ERRO
Exemplo de Elementos Requeridos do critério Particionamento
em Classes de Equivalência para o Cadastro de Crianças
Dentro da classe
de equivalência
P>0válidas
Como o testador lê o caso de teste
1 2 3
2,4 kg
Digita no programa
a entrada planejada
no caso de teste
OK
Executa a operação e verifica se
a saída do programa é a mesma
esperada no caso de teste
4 Caso a saída obtida seja a mesma da saída esperada
o teste é feito para a próxima variável de entrada
Teste Funcional
Análise do Valor Limite
• Em vez de se concentrar somente nas condições de entrada, a análise de valor limite deriva os casos de teste também do domínio de saída. Para aplicar este critério, deve-se seguir o seguinte roteiro:
1. Estabelecer as classes válidas e as inválidas para cada atributo do software (caso o critério descrito anteriormente tenha sido aplicado, essa etapa não precisa ser repetida).
2. Definir os limites dos atributos, ou seja, selecionar dados com um valor inferior, igual e outro superior ao limite.
Teste Funcional
Variável de
Entrada
Entrada Saída
Esperada
Saída Obtida
Data de Nascimento (DN)
1) 00
2) 01
3) 02
4) 30
5) 31
6) 32
7)11
8)12
9)13
10) ano atual-1
11) ano atual
12) ano atual+1
1- ERRO
2- OK
3- OK
4- OK
5- OK
6- ERRO
7- OK
8- OK
9- ERRO
10- OK
11- OK
12- ERRO
1- ERRO
2- OK
3- OK
4- OK
5- OK
6- ERRO
7- OK
8- OK
9- ERRO
10- OK
11- OK
12- ERRO
Peso da Criança (P) 13) P=-1
14) P=0
15) P=1
13- ERRO
14- ERRO
15- OK
13- ERRO
14- ERRO
15- OK
Exemplo de elemento requerido do critério Análise dos
Valores Limites para o Cadastro de Crianças
Teste Funcional
Teste Sistemático
• Combina os critérios Particionamentos de
Equivalência e Análise do Valor Limite
Variável de
Entrada
Classes de
Equivalência
válidas
Classes de
Equivalência
inválidas
Variáveis
de Entrada
Saída
Esperada
Saída
Obtida
Data de
Nascimento
(DN)
nasc <= sysdate nasc > sysdate 1) 21/03/2014
2) 22/03/2014
3) 23/03/2014
1) OK
2) OK
3) ERRO
1) OK
2) OK
3) ERRO
Teste Funcional
Outras Técnicas
• Error Guessing – abordagem ad-hoc na qual o testador
pratica, inconscientemente, uma técnica para projetar os
casos de teste, supondo por intuição e experiência
alguns tipos prováveis de erros.
• Grafo Causa-Efeito – Ajuda na definição de um conjunto
de casos de teste que exploram ambiguidade e
incompletude nas especificações.
Teste Funcional
Teste Estrutural - Definição
• É um método de projeto de testes que usa a
estrutura de controle do projeto procedimental
para derivar casos de teste;
• Baseia-se num minucioso exame dos detalhes
procedimentais;
• Caminhos lógicos de código do software são
testados;
• Não é viável testar todos os caminhos lógicos
de um programa (teste exaustivo).
Teste Estrutural
Vamos Imaginar a Seguinte Situação
• Programa Pascal com 100 linhas e dois ciclos
aninhados que executam entre 1 e 20 vezes
cada um dependendo do dado da entrada.
• Dentro do ciclo interior 4 construções se-
então-senão.
• 1014 caminhos possíveis de execução
• Se cada caso de teste for executado por um
processador “mágico” de testes em 1 mseg
• Vai levar 3170 anos para completar os testes.
Teste Estrutural
Casos de Testes Estruturais
• Devem garantir que todos os caminhos
independentes de um módulo tenham sido
exercitados pelo menos uma vez;
• Todas as decisões lógicas em seus lados
verdadeiro e falso devem ser executadas;
• Todos os laços de repetição nos seus limites e
dentro de seus intervalos operacionais devem
ser executados;
• As estruturas de dados internas devem ser
executadas.
Teste Estrutural
Geração de um Grafo
• Nós: blocos “indivisíveis”
– Não existe desvio para o meio do bloco;
– Uma vez que o primeiro comando do bloco é
executado, os demais comandos são
executados sequencialmente;
• Arestas ou Arcos: representam o fluxo de
controle entre os nós
Teste Estrutural
Vamos a um exemplo!
/* 01 */ {
/* 01 */ char achar;
/* 01 */ int length, valid_id;
/* 01 */ length = 0;
/* 01 */ printf (“Identificador: “);
/* 01 */ achar = fgetc (stdin);
/* 01 */ valid_id = valid_s(achar);
/* 01 */ if (valid_id)
/* 02 */ length = 1;
/* 03 */ achar = fgetc (stdin);
/* 04 */ while (achar != '\n')
/* 05 */ {
/* 05 */ if (!(valid_f(achar)))
/* 06 */ valid_id = 0;
/* 07 */ length++;
/* 07 */ achar = fgetc (stdin);
/* 07 */ }
/* 08 */ if (valid_id && (length >= 1) && (length < 6) )
/* 09 */ printf (“Valido\n“);
/* 10 */ else
/* 10 */ printf (“Invalido\n“);
/* 11 */ }
Identifier.c (função main) 01
02
03
04
05
06
07
08
09 10
11
Teste Estrutural
Detalhes Considerados no
Grafo• nó
• arco
• caminho
– simples
(1,2,3,4,5,6,7)
– Completo
(1,2,3,4,5,6,7,4,8,9,11)
(1,2,3,4,5,6,7,4,8,10,11)
• fluxo de controle
01
02
03
04
05
06
07
08
09 10
11
Teste Estrutural
Técnica Baseada em Erros
• Os requisitos de teste são derivados a partir dos
erros mais frequentes cometidos durante o
processo de desenvolvimento do software;
Teste Estrutural
Teste de Mutação
• Hipótese do Programador Competente
– Programadores experientes escrevem
programas corretos ou muito próximos do
correto.
• Efeito de Acoplamento
– Casos de teste capazes de revelar erros
simples são tão sensíveis que,
implicitamente, também são capazes de
revelar erros mais complexos.
Teste Estrutural
Teste de Mutação [2]
– Passos da Análise de Mutantes
1- Geração de Mutantes
• Para modelar os desvios sintáticos mais
comuns, operadores de mutação são
aplicados a um programa, transformando-
o em programas similares: mutantes.
Teste Estrutural
Teste de Mutação - Exemplo
Teste Estrutural
Mutante 02
if ((length >= 1) && (length <= 6) )
printf ("Valido\n");
else
printf ("Invalido\n");
Mutante 01
if ( (length >= 1) || (length < 6) )
printf ("Valido\n");
else
printf ("Invalido\n");
Código Original
if ( (length >= 1) && (length < 6) )
printf ("Valido\n");
else
printf ("Invalido\n");
length = 5
Saída = Valido
length = 5
Saída = Valido
length = 6
Saída = Valido
length = 6
Saída = Valido
length = 6
Saída = Invalido
length = 5
Saída = Valido
O mutante é eliminado
quando as mesmas
entradas, do código original
e do mutante, geram saídas
diferentes
Exercício
1. Derive o grafo de fluxo do código a seguir
Resposta