Different Kinds of Test
Tipos de Testes em Software
Classificações de Testes
- A literatura sobre testes não é consistente quanto às classificações, apresentando diversas formas de categorizar os testes.
- As classificações são ortogonais e podem ser combinadas para caracterizar melhor um teste, utilizando propriedades de diferentes classificações.
- A primeira classificação se relaciona ao fator de qualidade que o teste busca verificar, como desempenho, segurança e usabilidade.
Fatores de Qualidade
- O objetivo principal dos testes é fornecer evidências sobre o comportamento do sistema em relação a aspectos de qualidade esperados.
- Exemplos incluem testar a compatibilidade do software em diferentes sistemas operacionais ou versões.
Entidades de Programação
- A segunda classificação refere-se à entidade do código que será testada, podendo ser uma classe inteira ou um método específico.
- É importante definir qual parte do código será exercitada durante o teste.
Tratamento das Dependências
- A terceira classificação aborda como as dependências serão tratadas durante os testes, especialmente quando se trabalha com classes que têm dependências externas.
- Se forem usadas versões antigas das dependências ou stubs (implementações parciais), isso caracteriza um teste unitário.
Tipos de Teste
- Um teste unitário foca na classe específica com versões anteriores das dependências; já o teste de integração utiliza versões novas feitas por outros desenvolvedores.
Testes de Software: Integração e Dependências
Importância do Ambiente de Teste
- O teste de sistema deve ser realizado em um ambiente que reflita as condições reais, incluindo versões do sistema operacional e dependências necessárias para a execução correta do software.
Estrutura da Classe Servidor
- A classe servidor possui uma dependência com a lista de estudantes, criando objetos dessa lista e chamando métodos relacionados. Alterações na classe servidor são destacadas para indicar modificações.
Testes de Unidade e Integração
- Os testes de unidade devem ser executados com a versão mais recente da classe servidor, enquanto a classe estudante pode estar em uma versão antiga ou nova, dependendo das alterações feitas por outros membros da equipe.
- Para simular o comportamento esperado da nova versão da classe estudante, utiliza-se um "stub", permitindo testar a integração sem depender da implementação final.
Conceito de Mundo Aberto nos Testes
- O teste unitário é comparado ao conceito de "mundo aberto", onde se testa o código modificado sem ter acesso completo ao comportamento do restante do sistema.
- Essa abordagem permite assumir algumas propriedades do novo código, mesmo sem conhecê-las completamente.
Comparação entre Tipos de Testes
- Uma tabela resume os diferentes tipos de testes em relação às suas dependências e eficácia na detecção de bugs. O teste unitário é eficaz para identificar falhas isoladas no código modificado.
- O teste de integração ajuda na localização dos bugs, mas não tão eficientemente quanto o teste unitário devido à complexidade das interações entre várias partes do código.
Limitações dos Testes de Sistema
- Embora o teste de sistema mostre problemas durante a execução em um ambiente completo, ele oferece pouca ajuda na identificação precisa da origem dos defeitos.
- A importância dos testes unitários e integrais é ressaltada pela sua capacidade superior em localizar falhas específicas antes que elas se propaguem pelo sistema.
Garantia Comportamental pelos Stakeholders
Comparação de Tipos de Testes em Desenvolvimento de Software
Importância dos Testes de Unidade e Sistema
- Os testes de unidade podem não propagar falhas para problemas maiores observados pelo usuário, enquanto os testes de sistema oferecem uma garantia mais alta sobre a integridade do sistema.
- A cobertura dos testes unitários é baixa, pois eles avaliam apenas uma pequena parte do sistema, ao contrário dos testes de sistema que abrangem várias partes.
- O tempo necessário para executar diferentes tipos de teste varia; os testes unitários são rápidos, enquanto os testes de sistema são lentos devido à execução simultânea de várias partes do sistema.
Comportamento Não-Determinístico nos Testes
- Alguns testes apresentam comportamento não-determinístico, onde resultados podem variar entre execuções. Isso é mais comum em testes de sistema do que em testes unitários.
- Dependências externas, como serviços web, podem causar variações nos resultados dos testes. Testes unitários e integração podem evitar esse problema através da simulação dessas dependências.
Classificação dos Testes: Caixa Preta vs. Caixa Branca
- Os testes caixa-preta utilizam apenas especificações externas (entradas e saídas), sem acesso ao código-fonte. Já os caixa-branca analisam o código para criar casos de teste.
- Testes caixa-branca permitem identificar partes complicadas do código e gerar casos que exercitam fluxos específicos que podem levar a erros.
Garantias Providas pelos Testes
- Os testes de aceitação oferecem a maior garantia possível sobre a entrega do produto; se um teste passar, garante a aceitação da versão do software.
- Em contraste, os smoke tests fornecem garantias fracas; eles verificam funcionalidades básicas para assegurar que modificações não afetaram substancialmente o sistema.
Importância dos Testes Regressores
- Os testes regressores asseguram que funcionalidades previamente testadas continuam funcionando após novas alterações no código.
Compatibilidade de Comportamento em Testes de Software
Importância dos Testes de Regressão
- O teste de regressão fornece evidências sobre a preservação do comportamento do sistema ao longo do tempo, comparando versões diferentes.
- O teste diferencial permite verificar se implementações distintas da mesma especificação se comportam de maneira semelhante em diferentes plataformas ou dispositivos.
Classificações e Categorias de Testes
- É crucial entender as classificações dos testes, pois muitos artigos utilizam combinações dessas categorias para descrever garantias fornecidas pelos testes.
Tipos de Execução dos Testes
- Os testes podem ser automatizados (executados por computador) ou manuais (realizados por testadores humanos).
- Os testes manuais podem seguir um script rigoroso ou serem exploratórios, onde o testador investiga funcionalidades novas sem um roteiro fixo.
Comparação entre Testes Automatizados e Manuais
- Criar testes automatizados é caro devido à necessidade de programar a execução, mas sua execução é barata e pode ser feita repetidamente.
- A prática permite realizar testes regulares que garantem que novas mudanças não quebrem funcionalidades existentes.
Desafios nos Testes Manuais
- Embora os testes manuais sejam baratos para criar, eles são caros para executar devido à necessidade da intervenção humana.