Escolar Documentos
Profissional Documentos
Cultura Documentos
Plano de teste
Dentre outros objetivos, o plano de teste deve identificar os componentes do software
que serão testados e os recursos necessários para a correta execução dos mesmos,
recomendando e descrevendo as estratégias de teste a serem aplicadas. O plano de teste deve
conter e disponibilizar a documentação referente ao projeto em desenvolvimento, seus
requisitos funcionais e não funcionais, a fim de entender o que será testado no software. O
plano de teste deve conter as estratégias de teste, pois nela encontra-se a maneira como o
teste será realizado e quais técnicas e critérios serão utilizados. Listas contendo os tipos de
testes a serem aplicados, ferramentas, recursos de hardware e de pessoas disponíveis também
são parte do plano de teste. A cada teste realizado, informações sobre o que foi realizado, data
e hora de inicio e fim da atividade, nome do responsável pela mesma e resultados obtidos são
registrados (INTHURN, 2001).
Caso de teste
Um caso de teste pode ser definido como um documento que descreve as etapas a
serem seguidas para realização de um teste. Desde os dados de entrada, a atividade em
execução e o resultado de saída. É utilizado para observar se o resultado de saída é realmente
o esperado. Em caso positivo o teste foi realizado com êxito (INTHURN, 2001).
O caso de teste serve para verificar se o sistema segue as definições impostas no
projeto e se o mesmo foi devidamente construído. Segundo Bartié (2002), o caso de teste é o
documento que registra todo o planejamento dos testes, nele devem ser abordados os
seguintes itens:
ƒ identificação das condições de testes;
ƒ identificação do que será testado;
ƒ definição de cada caso de teste identificado;
ƒ detalhamento das classes de dados de entrada;
ƒ detalhamento da saída gerada;
ƒ responsáveis pela atividade de teste;
ƒ definição de como será realizada a bateria de testes;
ƒ cronograma das atividades.
Suíte de teste
É o documento que faz o detalhamento final dos testes, nele é identificado o
comportamento de cada caso de teste durante a execução. A suíte de teste estabelece a
ordem de execução e a maneira que cada caso de teste irá proceder (BARTIÉ, 2002).
O objetivo do conjunto de teste é auxiliar no exercício de verificar as especificações
dos requisitos funcionais e não funcionais do sistema, ou seja, constatar se o sistema procede
normalmente durante a execução das funções.
As linhas do grafo traçam os possíveis caminhos. É importante que a cada laço o teste
utilize um caminho independente até que todos os caminhos sejam percorridos. Caminhos
independentes são aqueles que executam instruções que ainda não foram executadas
(PRESSMAN, 1995).
Para encontrar o número de caminhos independentes é necessário realizar o cálculo
da complexidade ciclomática do grafo de fluxo do programa, esse cálculo é feito através da
fórmula (SOMMERVILLE, 2003):
CC(G) = Número (ramos) – Número (nós) + 2
sendo as setas correspondentes aos ramos e os círculos correspondentes aos nós, para o grafo
de fluxo na figura 02, CC(G) = 11 – 9 + 2 = 4. Quatro é o número de caminhos independentes.
Caminhos independentes:
Caminho 1: 1-11
Caminho 2: 1-2-3-4-5-10-1-11
Caminho 3: 1-2-4-6-8-9-10-1-11
Caminho 4: 1-2-3-6-7-9-10-1-11
Caminho não independente:
Caminho 5: 1-2-3-4-5-10-1-2-3-6-8-9-10-1-11
O caminho 5 não é independente porque todas as suas instruções já foram executadas
anteriormente, ou seja, não encontrou instruções ainda não executadas.
Pressman (1995) mostra duas outras maneiras de encontrar o número de caminhos
independentes, além da fórmula apresentada por Sommerville (2003). Uma é encontrando o
número de regiões (fechamento dos nós), que corresponde ao número de caminhos. A outra,
o número de nós predicativos (nó que apresenta condicional) mais um corresponde ao número
de caminhos independentes. De acordo com o grafo de fluxo:
CC(G) = Ramos – Nós + 2 = 11 – 9 + 2 = 4
CC(G) = Nós predicativos + 1 = 3 + 1 = 4
CC(G) = Regiões = 4
Teste de condição
O teste de condição é um método de projeto de casos de testes responsável por
certificar que todas as condições lógicas de um módulo do programa funcionem corretamente.
Uma condição simples pode ser definida como duas expressões aritméticas separadas por um
operador relacional (PRESSMAN, 1995):
E1 <operador relacional> E2,
em que E1 e E2 são as expressões aritméticas e o operador relacional sendo qualquer um
desses (<, ≤, =, ≠, >, ≥) ou ainda operadores booleanos (OR, AND e NOT). Uma condição
composta é definida com a união de duas ou mais condições simples.
O teste de condição consiste em testar cada condição existente no programa à procura
de erros. Uma condição é considerada incorreta quando pelo menos um componente da
condição está incorreto, ou seja, operadores lógicos ou booleanos ausentes ou a mais. O
mesmo acontece com os parênteses, além de erros na própria expressão aritmética ou
operador relacional.
Para encontrar erros nos operadores relacionais, três testes são realizados,
considerando que as expressões aritméticas estejam corretas, a E1 deve receber valores,
maior, menor e igual a E2.
Teste de laços
Normalmente o número de estruturas de repetição, laços ou loops, como são
conhecidos, utilizados na implementação de sistemas é muito grande, mesmo em pequenos
softwares, isso porque essas estruturas são extremamente necessárias, ou melhor, é inviável a
construção de um sistema sem a utilização de estruturas de repetição.
O teste de laços consiste em validar a estrutura dos laços. Existem quatro classes de
laços: laços simples, laços concatenados, laços aninhados e laços não-estruturados
(PRESSMAN, 1995):
ƒ Laços simples: cinco testes são realizados, 1) não entrando no laço; 2) somente uma
passagem pelo laço; 3) duas passagens pelo laço; 4) enquanto m<n passagens pelo laço; e
5) n-1, n, n+1 passagens pelo laço.
Laços aninhados: deve-se testar primeiro o laço interno e iniciar com valores mínimos
todos os laços; execute os testes de laços simples no laço interno sem alterar os valores do
laço externo; continue realizando testes com valores inaceitáveis. Repita até que todos os
laços sejam testados.
Laços concatenados: se os laços foram implementados de maneira individual, um
independe do outro, o teste realizado é o mesmo do mostrado anteriormente no laço
simples. Se os laços foram implementados de forma que um interaja com outro, ou seja, se
o contador do primeiro laço for utilizado como valor inicial para o segundo laço, o teste a
ser realizado é o mesmo mostrado anteriormente no laço concatenado.
Laços não-estruturados: para facilitar o teste é necessário reprojetar os grupos de laços de
forma que os mesmos se assemelhem à programação estruturada.
Teste unitário
O teste unitário consiste em validar a menor unidade do projeto, uma classe de
métodos, funções isoladas e unidades lógicas. A partir disso, testam-se módulos integrados a
outros e outros, até que se tenha o sistema completo. O mesmo deve ser realizado diversas
vezes, dia a dia, isso porque as falhas sempre aparecem e fica mais fácil corrigir pequenas
falhas do que corrigir o sistema inteiro depois de construído (MEDEIROS, 2005).
Medeiros (2005) afirma que a importância do teste unitário se dá na prevenção de
futuros erros no sistema. A única maneira de saber se o código é realmente bom é testando
sua reação diante de uma bateria de testes exaustivos, esses testes validam situações normais,
que deveriam ser bem sucedidas e situações de erro.
O mesmo autor ainda cita um exemplo do mundo real: pensando na fundamental
importância do teste unitário, imagine o resultado dos testes em um avião ou mesmo em um
navio apenas após o término de sua construção. Se algo sair errado, os danos podem ser
irreparáveis. Nada mais apropriado para descrever o resultado, do que uma tragédia.
Teste de integração
Durante o desenvolvimento do sistema os gerentes decidem quem ficará responsável
por cada fase de teste, normalmente cada programador se encarrega de testar seu próprio
código, ao final, as partes desenvolvidas por cada programador são passadas a outra equipe
que irá unificar os códigos. Essa equipe realiza a integração do software e mais testes são
feitos. Os testes são realizados em partes separadas ou subsistemas e no sistema como um
todo, por fim o teste é detalhadamente documentado e arquivado (SOMMERVILLE, 2003).
Um dos objetivos do teste de integração é detectar problemas junto às interfaces, ou
seja, erros que aparecem com a junção das partes do sistema. Antes da junção são realizados
testes nos pedaços individuais do sistema, os erros encontrados são corrigidos, outros erros
aparentemente “menores”, nem são notados. Mais tarde, com as partes do sistema
integradas, aqueles erros “menores” podem se apresentar não tão pequenos assim, e causar
falhas inaceitáveis no sistema (PRESSMAN, 1995).
Basicamente, o teste de integração consiste em verificar se as partes testadas
individualmente funcionam também unidas umas as outras, (INTHURN, 2001).
Pressman (1995) define dois tipos de integração de sistemas: a não incremental e a
incremental. A primeira consiste em desenvolver todos os módulos do sistema, realizar a
junção dos mesmos, e só depois iniciar a fase de testes. Normalmente os erros são tantos e a
dificuldade de correção é tamanha que o resultado é um sistema completamente inaceitável.
O teste de integração incremental tende a assegurar que o sistema possua uma quantidade
menor de erros, isso se faz possível pelo fato de que cada módulo do sistema é testado
individualmente antes da junção com os demais módulos, com isso fica mais fácil detectar e
corrigir os erros existentes. Após a junção novos testes são realizados para detectar outros
erros que possam aparecer. Um módulo pode funcionar corretamente quando testado
sozinho, e não funcionar normalmente quando integrado a outros módulos, por isso a
importância dos testes antes e depois da integração.
Integração Top-down
É uma abordagem da integração incremental. Segue uma ordem hierárquica, de cima
para baixo. Os módulos mais importantes do sistema são desenvolvidos primeiro, depois os
menos importantes. Após desenvolvido, cada módulo é testado individualmente, integrado
aos outros módulos e testado novamente, assim, é possível conferir se a interface com os
demais módulos continua compatível.
Integração Bottom-up
A ordem de teste dos módulos é inversa à top-down, os módulos menos importantes,
ou de níveis mais baixos da hierarquia são desenvolvidos e testados primeiro, depois os
próximos níveis a cima na hierarquia até que o último módulo seja testado.
Depuração de software
A depuração ou debugging ocorre quando um caso de teste encontra e mostra erros
do sistema, ou seja, para que se faça a depuração é necessário que os testes realizados
tenham obtido êxito.
A depuração consiste em analisar os resultados obtidos com os esperados, e, no caso
de diferença entre eles, encontrar a causa, ou seja, encontrar o motivo da não
correspondência entre os dados reais e os esperados, e, por fim, corrigir o problema
(PRESSMAN, 1995). Em resumo, a depuração objetiva encontrar e corrigir a causa, ou causas,
dos erros no sistema.