View
1
Download
0
Category
Preview:
Citation preview
1
Prof. Alessandro Garcia
Eduardo Fernandes (assistente)
LES/DI/PUC-Rio
Março 2018
Aula 5Introdução a Teste de Módulos
Avisos
• Horário de monitoria:
– Sextas-feiras, das 11:00 às 13:00
– Local: 9º andar do Prédio Pe. Leonel Franca
• Próxima aula: exercício (T1)
Mar 2018 2 /37Alessandro Garcia © LES - DI/PUC-Rio
2
Princípios discutidos até aqui
• Cada módulo deveria implementar uma única abstração
• Separação entre interface e implementação de um módulo
• Maximizar a declaração e a documentação de interface
implícita e explícita
• Garantir corretude sintática e semântica em conexões entre
funções/módulos
– nomes apropriados para funções e parâmetros
– o código do módulo cliente e/ou servidor deve checar tal
corretude (garantia de contrato)
• Encapsulamento
• Baixo acoplamento
• Alta coesão
Mar 2018 3 /37Alessandro Garcia © LES - DI/PUC-Rio
Especificação
• Objetivo dessa aula
– Definir conceitos básicos de falta – erro – falha
– Definir teste de software
– Apresentar como definir um módulo de teste manual
• Slides adaptados de: Staa, A.v. Notas de Aula em
Programação Modular; 2008.
• Referência básica:
– Monografia: Arcabouço para a Automação de Testes de
Programas Redigidos em C; contido no arquivo
TesteAutomatizado.zip acessível para download através do site
da disciplina, aba: Software
Mar 2018 4 /37Alessandro Garcia © LES - DI/PUC-Rio
3
Sumário
• Defeitos, erros e falhas
• Por que testar módulos?
• O que é testar programas?
• Módulo controlador de teste
• Teste manual
– Controlador de teste manual
Mar 2018 5 /37Alessandro Garcia © LES - DI/PUC-Rio
Até aqui, vimos...
• Princípios de modularidade para programação que levam a
programas de qualidade satisfatória por construção
– Módulos com interfaces bem definidas
– Garantir corretude em conexões
Mar 2018 6 /37Alessandro Garcia © LES - DI/PUC-Rio
4
Dados os princípios de modularidade...
• É desnecessário, então, conduzir um teste sistemático?
– Não, pois mesmo programas modulares por construção contém
faltas
• Nenhuma técnica de construção, ou mesmo de testes,
pode assegurar que o software não tenha faltas
• Objetivo: aplicar sistematicamente a execução de testes
para maximizar as chances de obter-se software com
qualidade satisfatória
– Encontrar faltas remanescentes no software
Mar 2018 7 /37Alessandro Garcia © LES - DI/PUC-Rio
Por que testar módulos?
• Programas podem conter defeitos (ou faltas) que, quando
exercitados, provocam erros de funcionamento. Quando
observados, estes erros passam a ser falhas.
– defeito: código errado (falta: a mesma coisa que defeito)
– erro: estado diferente do esperado ou desejado, ainda não
observado
– falha: estado diferente do esperado ou desejado, observado
• Faltas podem ser introduzidos à medida que evoluímos os
módulos
Mar 2018 8 /37Alessandro Garcia © LES - DI/PUC-Rio
5
Qualidade do software em execução
Mar 2018 9 /37Alessandro Garcia © LES - DI/PUC-Rio
Dados Produtorcria elemento
Erro
?
?
?
?
Observadorde erros
Defeito
Elemento
Sistema
a
b
c
d
e
f
g
h
i
j
k
Usuário
Lesão(conseqüência
de erro nãoobservado)
Falha
Resultados
Engano do produtorintroduz defeito Causa exógena
provoca um erro
Causaendógenaprovocaum erro
Por que módulos podem conter faltas?
• Humanos são falíveis (ferramentas também ), logo:
– podem se enganar ao redigir o código e inserir defeitos
– podem se enganar ao especificar o que se deseja que o
módulo faça
• a implementação correta passa a ser uma solução correta
do problema errado, ou seja a solução estará incorreta
– podem se enganar ao especificar os requisitos de
qualidade da solução
• a implementação correta cria problemas para o usuário, ou
seja a solução estará incorreta. Exemplos:
– programa não robusto
– tempo de resposta excessivamente demorado
– difícil de utilizar
Mar 2018 10 /37Alessandro Garcia © LES - DI/PUC-Rio
6
O que é correto por desenvolvimento?
• Um módulo é dito correto por desenvolvimento se ele for
desenvolvido de forma a estar sem defeitos antes de ser
posto em uso (disponibilizado)
• Qual a vantagem?
– redução do risco de danos
• prejuízos decorrentes de falhas ao processar
– custos tangíveis
» perda de vida
» prejuízo financeiro
» quebra de máquina
» quebra de empresa
» ...
– custos intangíveis
» alguns exemplos: perda de confiança, perda de imagem
Mar 2018 11 /37Alessandro Garcia © LES - DI/PUC-Rio
Relação entre Defeito – Erro - Falha
• O uso de muitas construções da linguagem de programação
(C, por exemplo) facilitam a inserção de defeitos em
programas
– atribuição vs. comparação de valores
– confusão: comparadores de valores
• Os defeitos somente se manifestarão na forma de erros
quando certas entradas (valores) forem acionados
Mar 2018 12 /37Alessandro Garcia © LES - DI/PUC-Rio
7
Exemplo – falha introduzida no uso…
Mar 2018 13 /37Alessandro Garcia © LES - DI/PUC-Rio
• Qual é o resultado de chamar a
função map com o valor de
argumento 11?
int map( int i ) {if( i > 0 )
if( i > 10 )return 10;
elsereturn –1;
return 0;}
A intenção do programador é a seguinte:
i >10 retornar 10i in 1..10 retornar 0i <= 0 retornar -1
A intenção do programador é a seguinte:
i >10 retornar 10i in 1..10 retornar 0i <= 0 retornar -1
• de cláusulas if.... (versão simplificada de uma função de mapeamento)
Exemplo – falha introduzida no uso…
Mar 2018 14 /37Alessandro Garcia © LES - DI/PUC-Rio
• Qual é o resultado de chamar a
função map com o valor de
argumento 5?
A intenção do programador é a seguinte:
i >10 retornar 10i in 1..10 retornar 0i <= 0 retornar -1
A intenção do programador é a seguinte:
i >10 retornar 10i in 1..10 retornar 0i <= 0 retornar -1
• de cláusulas if.... (versão simplificada de uma função de mapeamento)
Resposta: -1
int map( int i ) {if( i > 0 )
if( i > 10 )return 10;
elsereturn –1;
return 0;}
8
Exemplo – falha introduzida no uso…
Mar 2018 15 /37Alessandro Garcia © LES - DI/PUC-Rio
• Qual é o resultado de chamar a
função map com o valor de
argumento -3?
int map( int i ) {if( i > 0 )
if( i > 10 )return 10;
elsereturn –1;
return 0;}
A intenção do programador é a seguinte:
i >10 retornar 10i in 1..10 retornar 0i <= 0 retornar -1
A intenção do programador é a seguinte:
i >10 retornar 10i in 1..10 retornar 0i <= 0 retornar -1
O comportamento real é:i >10 retornar 10i in 1..10 retornar -1i <= 0 retornar 0
O compilador, na prática, associa a cláusula else com o if interno
associaçãodesejada
Qual é a falta introduzida
pelo programador?
associaçãoreal
defeito (ou falta)
Resposta: 0
Exemplo – falha introduzida no uso…
Mar 2018 16 /37Alessandro Garcia © LES - DI/PUC-Rio
int map( int i ) {if( i > 0 )
if( i > 10 )return 10;
elsereturn –1;
return 0;}
A intenção do programador é a seguinte:
i >10 retornar 10i in 1..10 retornar 0i <= 0 retornar -1
A intenção do programador é a seguinte:
i >10 retornar 10i in 1..10 retornar 0i <= 0 retornar -1
O comportamento real é:i >10 retornar 10i in 1..10 retornar -1i <= 0 retornar 0
O compilador, na prática, associa a cláusula else com o if interno
associaçãodesejada
Quais são as possíveis
situações de erro?
associaçãoreal
defeito (ou falta)
Erros: momento em que tais retornos
são gerados
9
Mar 2018 17 /37Alessandro Garcia © LES - DI/PUC-Rio
int map( int i ) {if( i > 0 )
if( i > 10 )return 10;
elsereturn –1;
return 0;}
A intenção do programador é a seguinte:
i >10 retornar 10i in 1..10 retornar 0i <= 0 retornar -1
A intenção do programador é a seguinte:
i >10 retornar 10i in 1..10 retornar 0i <= 0 retornar -1
O comportamento real é:i >10 retornar 10i in 1..10 retornar -1i <= 0 retornar 0
O compilador, na prática, associa a cláusula else com o if interno
associaçãodesejada
associaçãoreal
defeito (ou falta)
Falha: pode ser observada
pelo usuário ou administrador
Exemplo – falha introduzida no uso…
O que é testar um módulo?
• Teste é uma das técnicas dinâmicas de controle de
qualidade
• Um teste é um experimento controlado em que se confronta
o comportamento observado com o comportamento
esperado
– teste de corretude: existem diferenças entre o especificado e o
esperado?
• Como fazer isso?
– uma forma de teste é submeter o módulo a dados escolhidos e
comparar o resultado obtido com o resultado esperado,
calculado a partir da especificação e dos dados fornecidos
• Ex.: comparação em que o valor obtido não está dentro dos limites
de tolerância aceitáveis
– por exemplo, 0 >= Nota <= 10
Mar 2018 18 /37Alessandro Garcia © LES - DI/PUC-Rio
10
Como testar um módulo?
• Para testar um módulo, tornam-se necessários
– um módulo controlador do teste desenvolvido para testar
o módulo sob teste
• o módulo controlador exercita o módulo sob teste através
de sua interface
– uma massa de teste, isto é, um conjunto de casos de
teste
• caso de teste é um conjunto de dados e de ações do cliente/usuário
que exercitam o programa a testar em uma única ativação deste
Mar 2018 19 /37Alessandro Garcia © LES - DI/PUC-Rio
Exemplos de casos de teste
Mar 2018 20 /37Alessandro Garcia © LES - DI/PUC-Rio
Massa de teste
int map( int i ) {if( i > 0 )
if( i > 10 )return 10;
elsereturn –1;
return 0;}
Função i return
--------------------------
map 1 10
map 2 10
map 3 10
…
map 10 10
11
Exemplos de casos de teste
Mar 2018 21 /37Alessandro Garcia © LES - DI/PUC-Rio
Massa de teste
int map( int i ) {if( i > 0 )
if( i > 10 )return 10;
elsereturn –1;
return 0;}
Função i return
--------------------------
map 1 10
map 2 10
map 3 10
…
map 10 10
Essa é uma boa massa de teste?
Resposta
Mar 2018 22 /37Alessandro Garcia © LES - DI/PUC-Rio
public int map( int i ) {if( i > 0 )
if( i > 10 )return 10;
elsereturn –1;
return 0;}
A intenção do programador é a seguinte:
i >10 retornar 10i in 1..10 retornar 0i <= 0 retornar –1
A intenção do programador é a seguinte:
i >10 retornar 10i in 1..10 retornar 0i <= 0 retornar –1
O comportamento real é:i >10 retornar 10i in 1..10 retornar -1i <= 0 retornar 0
O compilador, na prática, associa a cláusula else com o if interno
associaçãodesejada
associaçãoreal
falta ou defeito
Não, pois não irá expor o programa
ao exercício do código com defeitos.
Importante: especificação completa
da sintaxe e semântica da interface.
12
Como testar um módulo?
Mar 2018 23 /37Alessandro Garcia © LES - DI/PUC-Rio
Massa de teste
int map( int i ) {if( i > 0 )
if( i > 10 )return 10;
elsereturn –1;
return 0;}
Função i return
--------------------------
map 1 10
map 2 10
map 3 10
…
map 10 10
Precisamos de um módulo auxiliar que permita
realizar as ativações dos casos de teste!
Como chegar lá?
Mar 2018 24 /37Alessandro Garcia © LES - DI/PUC-Rio
• Desenvolvimento incremental dos módulos
– a cada incremento do módulo são desenvolvidos e testados
• alguns (poucos) itens da interface
– se aprovado no teste, o incremento do módulo é aceito
– a seguir, passa-se a elaborar o próximo incremento até que o
módulo esteja completo
• o roteiro de teste é aumentado para contemplar o incremento
– quando o módulo estiver completo, revê-se o roteiro de teste
de modo que assegure a qualidade necessária
– retesta-se com o roteiro aprimorado e corrige-se se necessário
o módulo, repetindo até chegar a zero falhas
13
Como testar um módulo?
• Uso de um módulo controlador do teste
desenvolvido que auxilia a execução de casos de
teste para testar um módulo sob teste
• Três formas:
– Teste manual: controlador exibe um menu e
comparação é feita pelo próprio testador à olho nu
– Teste de comparação automatizado:
• Casos de teste são implementados em C
• Casos de teste são redigidos em scripts em uma linguagem
com uma sintaxe própria
Mar 2018 25 /37Alessandro Garcia © LES - DI/PUC-Rio
O que é um módulo controlador de teste?
Mar 2018 26 /37Alessandro Garcia © LES - DI/PUC-Rio
deve ser facilmente removível;
instrumentação: discutido em aulas futuras
14
O que é uma interface de um módulo?
• Considerando a linguagem C, é a parte de declaração
(header file, arquivo .h)
• Exemplo, módulo árvore – opera sobre uma única árvore:
ARV_tpCondRet ARV_InserirEsquerda( char Valor ) ;
ARV_tpCondRet ARV_InserirDireita( char Valor ) ;
ARV_tpCondRet ARV_IrEsquerda( void ) ;
ARV_tpCondRet ARV_IrDireita( void ) ;
ARV_tpCondRet ARV_ObterValorCorrente( char * pValor ) ;
Mar 2018 27 /37Alessandro Garcia © LES - DI/PUC-Rio
item da interface
O que seria um controlador?
• Exemplo de organização para teste manual
• O módulo controlador de teste exibe o menu de escolha do
comando de teste:
1 Inserir nó à esquerda
2 Inserir nó à direita
3 Ir para nó filho à esquerda
4 Ir para nó filho à direita
5 Obter valor do nó corrente
6 Exibir a árvore em formato parentetizado
99 Terminar
Escolha a opção:
Mar 2018 28 /37Alessandro Garcia © LES - DI/PUC-Rio
15
Um cenário de realização de testes
• Numa forma indisciplinada o testador:
1. ativa o programa
2. menu de teste de itens de interface é disponibilizado
3. seleciona uma opção (digitando 99 termina a execução)
4. fornece os dados solicitados
5. compara visualmente o resultado obtido com o resultado
que ele imagina deveria ser retornado
6. procura corrigir o programa caso o resultado esteja errado
7. repete a partir de 1
Mar 2018 29 /37Alessandro Garcia © LES - DI/PUC-Rio
O que seria um controlador?
Mar 2018 30 /37Alessandro Garcia © LES - DI/PUC-Rio
• Escolhida a opção, entra-se em um switch e realiza-se a
operação. Exemplo para uma das funções:
switch ( idAcao )
{
...
case AcaoInserirEsq:
printf( ” Inserir aa esquerda” ) ;
printf( ”\n Forneca o valor do no’ a inserir” ) ;
scanf( ” %10s” , Valor ) ;
CondRet = ARV_InserirEsquerda( Valor ) ;
printf( ”\nCondicao de retorno: %d\n” , CondRet ) ;
break ;
...
} /* switch */
item de interface
sendo testadoreceber valor do nó
imprime-se resultado que será comparado visualmente
pelo testador com o resultado esperado
16
Exemplo
• Exiba o exemplo árvore com teste manual
– diretório: \autotest\manual
• Não esquecer de, antes, executar o programa
– Executar o gmake antes: gmake /CExemploManual.COMP
– Compilar todos os arquivos: CompilaTudo.bat
• Executar ExemploManual.exe
Mar 2018 31 /37Alessandro Garcia © LES - DI/PUC-Rio
Sobre o teste manual
Quais seriam as suas principais vantagens?
E as suas desvantagens?
Mar 2018 32 /37Alessandro Garcia © LES - DI/PUC-Rio
17
Vantagens e desvantagens do teste manual
• Vantagens
– É relativamente simples de programar
– É mais fácil verificar a corretude caso esta se baseie em valores
aproximados
• evidentemente, isto requer que o testador saiba determinar quais as
aproximações aceitáveis
• Desvantagens
– O usuário não sabe quando testou tudo que deveria ser testado
• teste incompleto pode deixar defeitos remanescentes
– O usuário imagina o resultado esperado
– O usuário realiza testes que repetem condições já testadas
• teste redundante adiciona custo sem contribuir para descobrir novos defeitos
Mar 2018 33 /37Alessandro Garcia © LES - DI/PUC-Rio
Como testar um módulo?
• Uso de um módulo controlador do teste
desenvolvido que auxilia a execução de casos de
teste para testar um módulo sob teste
• Três formas:
– Teste manual: controlador exibe um menu e
comparação é feita pelo próprio testador à olho nu
– Teste de comparação automatizado:
• Casos de teste são implementados em C
• Casos de teste são redigidos em scripts em uma linguagem
com uma sintaxe própria
Mar 2018 34 /37Alessandro Garcia © LES - DI/PUC-Rio
18
Avisos
• Façam download do arcabouço, caso ainda não tenham feito
– venham com dúvidas para as próximas aulas
• Aula sobre instalação e uso do arcabouço
• Já podem começar a verificar como funciona o teste do
módulo Lista
– estudar e usar o módulo Lista
– estudar o módulo TesteLis
– melhoria dos testes deste módulo
– estudo da monografia disponível no sítio eletrônico
– executar o exemplo de teste manual da pasta Manual
Mar 2018 35 /37Alessandro Garcia © LES - DI/PUC-Rio
Trabalho prática da disciplina
• Referência básica:
– Monografia: Arcabouço para a Automação de Testes de
Programas Redigidos em C; contido no arquivo
TesteAutomatizado.zip acessível para download através do
site da disciplina, aba: Software
• Comecem a instalar o arcabouço
– Seção 2 da monografia dá todos os passos de instalação
– Ler o arquivo “...readme” para verificar como instalar
– “Recomenda-se fortemente...” = leia-se “DEVE LER”
– Comece a utilizar os exemplos e arcabouço de testes...
Mar 2018 36 /37Alessandro Garcia © LES - DI/PUC-Rio
19
Prof. Alessandro Garcia
Eduardo Fernandes (assistente)
LES/DI/PUC-Rio
Março 2018
Aula 5Introdução a Teste de Módulos
Recommended