Testes de Software Prof. Edjandir C. Costa edjandir.costa@ifsc.edu.br
Sumário - Processo de teste - Estágios de teste - Diferenças entre tipos de testes
Processo de Teste Dois objetivos distintos: - Demonstrar ao desenvolvedor e ao cliente que o software atende a seus requisitos; - Descobrir situações em que o software se comporta de maneira incorreta, indesejável ou de forma diferente das especificações.
Verificação e Validação Segundo Dijkstra: os testes podem mostrar apenas a presença de erros, e não sua ausência. O teste é parte de um amplo processo de verificação e validação (v&v). Para Boehm: - Validação: estamos construindo o produto certo? - Verificação: estamos construindo o produto da maneira certa?
Verificação e Validação O objetivo final dos processos de verificação e validação é estabelecer a confiança de que o software está pronto para seu propósito. O nível de confiança exigido depende: - Finalidade do software; - Expectativa de usuários; - Ambiente de marketing.
Verificação e Validação O processo V&V pode incluir inspeções e revisões. São chamadas de técnicas estáticas, pois você não precisa executar o software para verificá-lo. Incluem: inspeções e revisões de requisitos, modelos de projeto, código-fonte e até mesmo testes de sistema.
Verificação e Validação Existem três vantagens da inspeção de software sobre testes: -Durante o teste, erros podem mascarar outros erros. Uma sessão única de inspeção pode descobrir muitos erros no sistema; -Versões incompletas do sistema podem ser inspecionadas sem custos adicionais; -Além da procura por defeitos, uma inspeção pode considerar outros atributos de qualidade, como a conformidade a padrões, portabilidade e manutenibilidade.
Verificação e Validação Inspeções não podem substituir os testes. As inspeções não são boas para descobrir defeitos que surgem devido a interações inesperadas entre diferentes partes de um programa, problemas de timing ou com desempenho de sitema.
Um modelo do processo de teste de software Casos de teste Dados de teste Resultados de teste Relatórios de teste Projetar casos de teste Preparar dados de teste Executar programa com dados de teste Comparar resultados para os casos de testes
Estágios de teste O software tem de passar por três estágios de teste: - Testes em desenvolvimento: o sistema é testado durante o desenvolvimento para descobrir bugs e defeitos; - Testes de release: uma equipe independente testa uma versão completa do sistema antes que seja liberado para os usuários; - Testes de usuário: usuários testam o sistema em seu próprio ambiente. Testes de aceitação entram nesse estágio.
Testes de desenvolvimento O testador do software geralmente é o programador que o desenvolveu, porém alguns processos usam programadores/testadores em pares, nos quais cada programador tem um testador. São essencialmente um processo de teste de defeitos, em que o objetivo é descobrir bugs no software e normalmente são intercalados com depuração.
Testes de desenvolvimento Durante este estágio o teste pode ocorrer em três níveis de granularidade: - Teste unitário: unidades individuais ou classes são testadas individualmente; - Teste de componente: várias unidades são integradas para criar componentes. Os testes devem testar as interfaces dos componentes; - Teste de sistema: deve concentrar-se em testar interações entre componentes.
Testes de desenvolvimento Teste Unitário O teste deve ser projetado para cobrir todas as características da classe/objeto: - Testar todas as operações associadas ao objeto; - Definir e verificar o valor de todos os atributos associados ao objeto; - Colocar o objeto em todos os estados possíveis,ou seja, simular todos os eventos que causam mudanças de estado.
Testes de desenvolvimento Teste Unitário Um teste automatizado tem três partes: - Uma parte de configuração, em que você inicia o sistema com o caso de teste, ou seja, as entradas e saídas esperadas; - Uma parte de chamada, quando você chama o objeto ou método a ser testado; - Uma parte de afirmação, em que você compara o resultado da chamada com o resultado esperado. Se a afirmação for verdadeira, o teste foi bem-sucedido, se for falsa, ele falhou.
Testes de desenvolvimento Teste de componente Partindo da premissa que os testes unitários já foram concluídos, os testes de componentes exploram a interação de cada objeto no sentindo de garantir que o conjunto se comporta de acordo com o esperado. O teste se preocupa com a interface do componente, ou seja as operações visíveis do componente para o sistema. Essas operações vão por sua vez dispara operações das unidades e combinar o resultado de suas chamadas.
Testes de desenvolvimento Teste de componente Caso de teste A B C
Testes de desenvolvimento Teste de sistema Durante o teste de sistema, os componentes são integrados e o sistema completo é testado. Nesse estágio, o processo é coletivo e não individual, ou seja componentes desenvolvidos por equipes diferentes são testados a fim de garantir a funcionalidade do sistema.
Testes de desenvolvimento Teste de sistema Recomendações: - Todas as funções do sistema acessadas por meio de menus devem ser testadas; - Combinações de funções (por exemplo, a formatação do texto) acessadas por meio de menu devem ser testadas; - Nos casos em que a entrada de dados é fornecida, todas as funções devem ser testadas com entradas corretas e incorretas.
Testes de release É o processo de testar um release particular de um sistema que se destina para uso fora da equipe de desenvolvimento. Existem duas diferenças entre o teste de release e o teste de sistema: - Uma equipe separada, que não esteve envolvida no projeto deve ser a responsável; - O objetivo é verificar se o sistema atende a seus requisitos e não encontrar bugs.
Testes de release Teste baseados em requisitos Um princípio de boa prática da engenharia de requisitos é que os requisitos devem ser testáveis, ou seja, deve ser escrito de modo que um teste possa ser projetado para ele. Nesse caso, a partir de um requisito é derivado um conjunto de testes é um teste de validação.
Testes de release Testes de cenário Imaginam-se cenários típicos de uso do sistema e desenvolvem-se casos de testes para o sistema. Um cenário é uma estória que descreve uma maneira de usar o sistema. Podem ser usados casos de uso ou estórias de usuário para a criação dos casos de testes.
Testes de release Testes de desempenho - Verificam a sobrecarga do sistema que pode fazer com que ele caia. - Estressam o sistema e trazem à luz defeitos que normalmente não são descobertos. - São relevantes para sistemas distribuídos, pois esses sistemas podem apresentar degradação severa quando estão muito carregados. Os processos tornam-se mais lentos à medida que aguardam os dados requisitados a outros processos.
Testes de usuário É praticamente impossível para um desenvolvedor replicar o ambiente de trabalho do sistema. Por exemplo, um sistema que se destina a ser usado em um hospital é usado em um ambiente clínico em que outras coisas estão acontecendo, como emergências de pacientes, conversas com parentes, etc. Isso tudo afeta o uso de um sistema, e dificilmente o desenvolvedor consegue replicar esse cenário em seu ambiente de desenvolvimento.
Testes de usuário Na prática, existem três tipos de testes de usuário: - Teste alfa: os futuros usuários trabalham com os equipe para testar o software no local de desenvolvimento; - Teste beta: o release é liberado aos usuários para que possam experimentar e levantar e reportar os problemas para os desenvolvedores; - Teste de aceitação: os clientes testam o sistema para decidir se está pronto ou não para ser aceito e implantado.
Testes de usuário Existem seis estágios no teste de aceitação: - Definição dos critérios de aceitação; - Planejamento dos testes; - Derivação dos testes (projeto dos testes); - Execução dos testes; - Negociação de resultados; - Rejeitar/aceitar o sistema.
Atividades 1. Por que os testes podem apenas detectar a presença de erros e não a sua ausência? 2. Considere um sistema (Biblioteca, Locadora, Flowernet, Estacionamento ou Livraria Virtual) e elabore: - Uma lista de critérios de aceitação; - Um plano para execução dos testes de aceitação; 3. Pesquise uma ferramenta de testes unitários e tente construir um teste com essa ferramenta.
Bibliografia SOMMERVILLE, I.; Engenharia de Software. 9 a. Edição. São Paulo: Pearson, 2011.