Gerência e Qualidade de Software - Aula 07 - Conceitos de teste de software
Conceitos de Teste de Software
Introdução ao Teste de Software
- O teste é uma forma importante de verificação e validação, mas não é a única. O objetivo do teste é executar um software à procura de defeitos.
- A ideia comum é que o teste garante a ausência de defeitos, mas isso não é verdade; o foco deve ser encontrar o maior número possível de falhas.
Limitações dos Testes
- Um software que passou nos testes não significa que está livre de defeitos; pode indicar que os testes realizados foram insuficientes.
- A quantidade imensa de combinações possíveis em um método simples ilustra a dificuldade em testar tudo. Por exemplo, um método com três parâmetros pode ter 2^129 combinações.
Desafios na Execução dos Testes
- Mesmo com computadores rápidos, como um Intel Core i7, levaria mais tempo do que a idade do universo para testar todas as combinações possíveis desse método.
- Portanto, escolher quais testes realizar se torna essencial para maximizar a eficiência e eficácia da detecção de defeitos.
Técnicas para Seleção de Testes
- Existem técnicas estruturais (caixa branca) e comportamentais (caixa preta). A técnica caixa preta foca nas entradas e saídas sem considerar a implementação interna.
- O teste funcional caixa preta analisa se o comportamento do software atende às especificações definidas.
Métodos Específicos no Teste Caixa Preta
- Dentro da técnica caixa preta, existem várias abordagens como partição equivalente e valores-limite.
Análise de Condições de Entrada em Testes
Considerações Iniciais sobre Especificações
- A análise das condições de entrada é fundamental e não deve ser feita sem olhar a especificação do que está sendo testado. É importante agrupar entradas em conjuntos relevantes.
- Exemplos práticos, como o teste de uma fila, mostram que as condições de entrada podem incluir estados como "fila cheia" ou "fila vazia", além de valores específicos.
Exemplo Prático: Cálculo de Preço
- O método discutido calcula o preço considerando três parâmetros: preço real, margem de lucro (entre 0 e 1), e desconto para pagamentos à vista (5%).
- As variações nos parâmetros são limitadas; por exemplo, a margem deve estar entre 0 e 1, enquanto valores negativos ou superiores a 1 são considerados inválidos.
Classes Válidas e Inválidas
- Para criar testes eficazes, é necessário considerar tanto classes válidas quanto inválidas. As classes válidas devem ser agrupadas para facilitar a identificação de falhas.
- Cada classe inválida deve ser testada separadamente para evitar compensações que possam mascarar erros no sistema.
Estratégias para Teste
- Ao testar classes válidas, busca-se maximizar o número delas em um único teste. Por exemplo, se uma classe válida é "preço maior que zero", ela pode ser combinada com outras classes válidas.
- As classes inválidas incluem valores como "menor que zero" ou "maior que um", onde cada uma deve ser testada isoladamente.
Técnicas Adicionais: Limites e Fronteiras
- Uma técnica complementar é testar os limites dos parâmetros. Muitos defeitos ocorrem nas fronteiras dos valores permitidos.
- A ideia é verificar se os desenvolvedores consideraram corretamente os limites inferior e superior ao definir as entradas do método.
Exemplos Práticos com Fronteiras
- Um exemplo prático envolve testar valores próximos aos limites definidos na especificação. Isso inclui verificar se um valor ligeiramente acima ou abaixo do limite gera o resultado esperado.
Técnicas de Teste em Software
Limites de Preço e Margens
- Discussão sobre a definição de um valor limite superior para produtos em uma loja, considerando margens de investimento como zero. A ideia é explorar diferentes cenários com base nesse limite.
Testes Caixa Branca
- Introdução ao teste caixa branca, onde se conhece a estrutura interna do módulo testado, permitindo visualizar os caminhos internos e não apenas as entradas e saídas.
- Desafio dos testes caixa branca: a complexidade aumenta com laços que geram múltiplos caminhos. Exemplo dado sobre variáveis que podem ter várias opções de execução.
Estratégias para Limitar Testes
- Sugestão de limitar os testes a um conjunto interessante, utilizando critérios como conciliar todas as arestas do código. Isso permite testar todos os caminhos sem precisar percorrer cada um deles individualmente.
- Demonstração prática com um exemplo de código que possui um defeito proposital relacionado à margem, ilustrando como transformar o código em um grafo para análise.
Análise Gráfica dos Caminhos
- Explicação sobre como cada comando no código se torna uma aresta em um grafo, facilitando a visualização das condições e opções disponíveis durante o teste.
- O gráfico resultante mostra as interações entre as condições (vértices), permitindo identificar quais caminhos foram percorridos durante os testes.
Abordagem Baseada em Arestas
- Proposta de passar por todas as arestas do grafo gerado pelo código, garantindo que todos os caminhos sejam considerados nos testes.
- Importância da escolha dos valores utilizados nos testes; sugere-se usar valores limites para cada condição identificada no código.
Níveis de Teste em Software
- Discussão sobre diferentes níveis de teste existentes no desenvolvimento de software, incluindo teste unitário, integração e sistema.
- O teste unitário foca na menor unidade do software (ex: classes), enquanto o teste integração avalia a interação entre essas unidades.
Testes de Aceitação e Análise de Requisitos
Importância do Teste de Aceitação
- O teste de aceitação é o último nível de teste, focando na definição e análise dos requisitos, mas principalmente nas metas do usuário.
- As metas do usuário nem sempre podem ser traduzidas diretamente em requisitos formais, refletindo a complexidade das necessidades expressas pelos usuários.
- O teste de aceitação analisa como as necessidades e problemas dos usuários são representados nos requisitos, garantindo que suas expectativas sejam atendidas.
- É fundamental entender que os usuários têm dificuldades em expressar suas necessidades, o que pode impactar a eficácia da análise de requisitos.