Níveis de teste de acordo com o SWEBOK
Introdução
Esse capítulo tem o objetivo de apresentar os níveis de teste de acordo com o Guide to the Software Engineering Body of Knowledge (SWEBOK) [SWEBOK] (Guia para a Base de Conhecimento de Engenharia de Software), fornecendo assim uma ideia geral sobre os conceitos relacionados ao teste de software.
O SWEBOK é um guia criado pelo Institute of Electrical and Electronics Engineers - IEEE (Instituto de Engenheiros Elétricos e Eletrônicos) que trata de vários aspectos sobre a Engenharia de Software. O capítulo 4 de sua terceira e última edição é dedicado a testes de software. Cumpre ressaltar que essa obra informa que o teste de software geralmente é realizado em diferentes níveis ao longo dos processos de desenvolvimento e manutenção. Os níveis podem ser distinguidos tomando como base o objeto que será testado. Este varia conforme (i) o escopo, que é chamado de alvo, ou (ii) finalidade, que é chamado de objetivo.
Como esse capítulo está estruturado
O presente capítulo possui duas seções, a saber:
-
Em Alvo do teste são apresentados os conceitos sobre os níveis de testes, em que é verificada uma parte do software que está sendo desenvolvido. O nível é diferente conforme o escopo.
-
Objetivos do teste é responsável por falar sobre os níveis de testes usados quando temos um objetivo em vista, como usabilidade ou performance.
-
Técnicas para o Teste de Software
-
Medidas de Teste de Software
-
Avaliação dos Testes Realizados (?)
Alvo do teste
O alvo do teste está relacionado ao escopo, podendo ser um:
-
único módulo;
-
grupo desses módulos (relacionados por finalidade, uso, comportamento ou estrutura);
-
ou um sistema inteiro.
Podemos criar três estágios ou níveis de teste. Esses três estágios de teste não implicam em nenhum modelo de processo e nenhum deles é considerado mais importante que os outros.
Testes de unidade / unitários
Os testes de unidade, comumente chamados de testes unitários, são responsáveis por verificar o funcionamento de elementos de software de maneira isolada. Ou seja, eles são testados individualmente. O teste de unidade focaliza o esforço de verificação na menor unidade do projeto de software — o componente ou módulo de software. Se estivermos escrevendo um código usando uma linguagem como o Java por exemplo, serão testados os métodos das classes, uma vez que eles normalmente são as menores unidades do projeto. O teste de unidade, na maioria das vezes, ocorre com acesso ao código fonte que está sendo testado e com o suporte de ferramentas de depuração. Os programadores que escreveram o código frequentemente, mas nem sempre, realizam testes unitários. O Test Driven Development (TDD) ou Desenvolvimento Guiado por Testes, um exemplo de teste unitário, é apresentado na seção a seguir.
Desenvolvimento Guiado por Testes (TDD, do inglês Test Driven Development)
O TDD é uma abordagem para o desenvolvimento de programas em que se intercalam testes e a escrita de código-fonte. O código evolui de maneira incremental, juntamente com um teste para esse incremento. Importante: Nada é feito, ou seja, nenhum novo código é escrito, sem que aquilo que está sendo testado passe no teste. A figura O ciclo do TDD, mostrada a seguir, que foi copiada do livro de Engenharia de Software de Ian Sommerville[SOMMERVILLE], fornece uma visão geral sobre o processo do TDD.
O ciclo de desenvolvimento usando o TDD envolve, antes de tudo, uma mudança no paradigma ao qual o programador está acostumado. Ao invés de começar a escrever a funcionalidade a ser incrementada, ele escreve um teste. A sequência de passos do TDD pode ser explicada assim:
-
Identificar o incremento necessário. Ele deve ser pequeno e implementável em poucas linhas de código. Ele não será escrito ainda;
-
Escrever um teste para esse incremento. Esse teste será feito por uma ferramenta própria de testes, como o JUnit. Essa ferramenta é que fará o teste e relatará se houve sucesso ou não.
-
Executar o teste. A ferramenta poderá também refazer todos os testes que já foram feitos anteriormente. Nesse caso, o resultado obtido é uma falha do teste. Mas por que? Lembre-se que você ainda não implementou a nova funcionalidade. Essa falha o ajudará a não esquecer de fazer a codificação.
-
Implementar a nova funcionalidade e executar o teste novamente. O código pode ser refatorado para melhorá-lo.
-
Depois que os testes forem executados com sucesso, voltamos ao passo 1.
Benefícios do TDD
- Cobertura de código
-
Cada segmento de código que você escreve deve ter pelo menos um teste associado.
- Testes de regressão
-
Um conjunto de testes de regressão é desenvolvido de forma incremental enquanto um programa é desenvolvido.
- Depuração simplificada
-
Quando um teste falhar, deve ser óbvio onde está o problema. O código recém-escrito tem de ser verificado e modificado.
- Documentação de sistema
-
Os próprios testes são uma forma de documentação que descreve o que o código deve estar fazendo.
Testes de integração
O teste de integração, também conhecido como teste de componente, é o processo de verificar as interações entre os componentes de software. Ele fará com que duas ou mais classes, por exemplo, sejam postas em funcionamento juntas. Devemos pensar que se individualmente elas funcionaram, quando colocadas juntas, elas devem continuar funcionando. Estratégias clássicas de teste de integração, como top-down e bottom-up, são frequentemente usadas com software estruturado hierarquicamente. Estratégias de integração modernas e sistemáticas são tipicamente direcionadas à arquitetura, o que envolve a integração gradual dos componentes ou subsistemas de software, com base em segmentos funcionais identificados.
O teste de integração geralmente é uma atividade contínua em cada estágio do desenvolvimento, durante o qual os engenheiros de software abstraem as perspectivas de nível inferior e concentram-se nas perspectivas do nível em que estão integrando. Para outros, além do software pequeno e simples, as estratégias de teste de integração incremental geralmente são preferidas para reunir todos os componentes de uma só vez - o que geralmente é chamado de teste “big bang”.
Teste de sistema
O teste do sistema está preocupado em testar o comportamento de um sistema inteiro, definido pelo escopo de um projeto ou programa de desenvolvimento. De acordo com o ISTQB, no teste de sistema, o ambiente de teste deve corresponder o máximo possível ao objetivo final ou ao ambiente de produção. Isto visa minimizar os riscos de falhas específicas de ambiente não serem encontradas durante o teste. Ele pode ser baseado em descrições de alto nível do comportamento do sistema, tais como: (i) especificação de riscos e/ou de requisitos, (ii) processos de negócios ou (iii) casos de uso.
O teste do sistema é geralmente considerado apropriado para avaliar os requisitos não funcionais do sistema como segurança, velocidade, precisão e confiabilidade. Interfaces externas para outros aplicativos, utilitários, dispositivos de hardware ou os ambientes operacionais também são geralmente avaliados nesse nível. Uma equipe de teste independente é frequentemente responsável pelos testes de sistema.
Objetivos do teste
Quando tratamos de objetivos do teste, estamos nos referindo a uma característica específica. Ela pode sofrer alterações conforme o software é testado. Segundo o SWEBOK, declarar os objetivos do teste em termos precisos e quantitativos permite que os resultados obtidos possam ser medidos, além de dar mais controle ao processo de teste.
O teste pode ser destinado a verificar propriedades diferentes. Os casos de teste podem ser projetados para verificar se as especificações funcionais estão corretamente implementadas. Isto é referido na literatura como testes de conformidade, testes de correção ou testes funcionais. No entanto, várias outras propriedades emergentes também podem ser testadas, incluindo desempenho, confiabilidade, entre muitas outras.
Outros objetivos importantes para o teste incluem, mas não se limitam a, identificação de vulnerabilidades de segurança, avaliação de usabilidade e aceitação de software. Para estes objetivos, diferentes abordagens podem ser adotadas. Observe que, em geral, os objetivos do teste variam de acordo com a meta de teste; diferentes finalidades são abordadas em diferentes níveis de teste.
O SWEBOK enumera 13 tipos de testes na categoria de objetivos do teste. Os tipos elencados a seguir são os mais usados na literatura. Observe que alguns são mais apropriados, por exemplo, para:
-
pacotes de software personalizados, como os testes de instalação;
-
e outros para produtos de consumo, como os testes beta.
Teste de Aceitação / Qualificação
O teste de aceitação / qualificação determina se um sistema satisfaz seus critérios de aceitação, geralmente verificando os comportamentos desejados do sistema em relação aos requisitos do cliente. O cliente ou representante de um cliente, portanto, especifica ou realiza atividades diretamente para verificar se seus requisitos foram atendidos. No caso de um produto de consumo,ele verifica se a organização atendeu aos requisitos estabelecidos para o mercado-alvo.
O objetivo desse teste é estabelecer a confiança no sistema, parte do sistema ou uma característica não específica do sistema. Procurar defeitos não é o principal foco. Ele pode avaliar a disponibilidade do sistema para entrar em produção. Este não é necessariamente o último nível de teste, uma vez que, por exemplo, um teste de integração em larga escala pode ser feito posteriormente.
Esse teste é realizado pelo cliente ou por usuários do sistema; os interessados (stakeholders) também podem ser envolvidos.
Testes de Instalação
Muitas vezes, após a conclusão do sistema e teste de aceitação, o software é verificado no ambiente de destino. Os testes de instalação podem ser vistos como testes de sistema realizados no ambiente operacional, com configurações de hardware e outras restrições operacionais específicas. Os procedimentos de instalação também podem ser verificados.
Teste Alfa e Beta
Antes do lançamento, o software as vezes é fornecido a (i) um grupo pequeno e selecionado de usuários em potencial para uso experimental (teste alfa) e/ou (ii) para um conjunto maior de usuários representativos (teste beta). Esses usuários relatam problemas com o produto. Os testes alfa e beta geralmente não são controlados e nem sempre são mencionados em um plano de teste.
Teste de Conquista e Avaliação de Confiabilidade
Este tipo de teste melhora a confiabilidade do sistema, identificando e corrigindo falhas. Além disso, medidas estatísticas de confiabilidade podem ser obtidas gerando aleatoriamente casos de teste de acordo com o perfil operacional do software (consulte Perfil Operacional na seção 3.5, Técnicas Baseadas em Uso). Esta última abordagem é chamada de teste operacional. Usando modelos de crescimento de confiabilidade, ambos os objetivos podem ser perseguidos juntos (ver Teste de Vida, Avaliação de Confiabilidade na seção 4.1, Avaliação do Programa em Teste).
Teste de Regressão
Um teste de regressão mostra que o software ainda passa nos testes feitos anteriormente (na verdade, às vezes também é chamado de teste de não-regressão). Para desenvolvimento incremental, o objetivo do teste de regressão é mostrar que o comportamento do software não é alterado por mudanças incrementais no software, exceto na medida em que deveria. Em alguns casos, uma compensação deve ser feita entre (i) a garantia dada pelo teste de regressão, toda vez que uma alteração é feita, e (ii) os recursos necessários para executar os testes de regressão. Esta compensação pode ser bastante demorada devido ao grande número de testes que podem ser executados.
O teste de regressão envolve selecionar, minimizar e/ou priorizar um subconjunto dos casos de teste em um conjunto de testes existente. O teste de regressão pode ser realizado em cada um dos níveis de teste descritos na seção 2.1, O Alvo do Teste, e pode ser aplicado a testes funcionais e não funcionais.
Teste de Performance
O teste de desempenho verifica se o software atende aos requisitos de desempenho especificados. Ele ainda avalia as características de desempenho - por exemplo, capacidade e tempo de resposta.
Testes de Segurança
O teste de segurança é focado em verificar se o software está protegido contra ataques externos. Em particular, o teste de segurança verifica a confidencialidade, integridade e disponibilidade dos sistemas e seus dados. Geralmente, o teste de segurança inclui a verificação contra uso indevido e abuso do software ou sistema (teste negativo).
Exemplos de testes de segurança são os chamados Testes de Penetração (Penetration Test, PenTest).
Teste de Estresse
O teste de estresse executa o software na carga máxima do projeto, com o objetivo de determinar os limites comportamentais e testar os mecanismos de defesa em sistemas críticos.
Teste back-to-back [7]
O padrão IEEE/ISO/IEC 24765 define o teste back-to-back como “teste em que duas ou mais variantes de um programa são executadas com as mesmas entradas, as saídas são comparadas e os erros são analisados em caso de discrepâncias”.
Teste de Recuperação
O teste de recuperação visa verificar os recursos de reinicialização do software após uma falha do sistema ou outro "desastre". Isto visa medir a capacidade de resiliência do software, ou seja, de recuperação após uma falha. Normalmente neste tipo de teste, falhas são intencionalmente injetadas no ambiente em que o sistema está sendo testado, para avaliar o comportamento do software nestes casos.
Teste de Interface
Os defeitos da interface são comuns em sistemas complexos. O teste de interface visa verificar se os componentes fazem interface corretamente para fornecer a troca correta de dados e informações de controle. Normalmente, os casos de teste são gerados a partir da especificação da interface. Um objetivo específico do teste de interface é simular o uso de APIs por aplicativos de usuário final. Isso envolve a geração de parâmetros das chamadas da API, a configuração de condições externas do ambiente e a definição de dados internos que afetam a API.
Teste de Configuração
Nos casos em que o software é criado para atender a diferentes usuários, o teste de configuração verifica o software em diferentes configurações especificadas.
Teste de Usabilidade e Interação Homem-Computador
A principal tarefa dos testes de usabilidade e interação entre o homem e computador é avaliar como é fácil para os usuários finais aprenderem a usar o software. Em geral, pode envolver o teste das funções do software que suportam as tarefas do usuário, a documentação para auxílio aos usuários e a capacidade do sistema de se recuperar de erros humanos (consulte Design da interface do usuário no Software Design KA).
=x=x=x=x=x=x=x
Testes de Desenvolvimento
Os testes de desenvolvimento representam todos os testes que são realizados pelos desenvolvedores de um sistema. Nesse caso, o testador é o próprio desenvolvedor ou um membro da equipe. Um exemplo são os testes unitários.
Teste de Aceitação
O teste de aceitação ou de aceite frequentemente é realizado pelo cliente ou por um usuário do sistema; os interessados (stakeholders) também podem ser envolvidos. O objetivo desse teste é estabelecer a confiança no sistema, parte do sistema ou em uma característica não específica do sistema. Procurar defeitos não é o principal foco. Ele pode avaliar a disponibilidade do sistema para entrar em produção. Este não é necessariamente o último nível de teste, uma vez que, por exemplo, um teste de integração em larga escala pode ser feito posteriormente. As formas de teste de aceite incluem tipicamente os seguintes:
-
Teste de aceitação pelo usuário
-
Teste operacional de aceite
-
Teste de aceite de contrato e regulamento
-
Teste Alfa e Beta (ou teste no campo)
- Teste Alfa
-
Realizados pelos usuários - testes manuais. São testes realizados em um ambiente controlado pelo desenvolvedor que registra os problemas de uso e os erros que aconteceram.
- Teste Beta
-
Realizados pelos usuários mais usuários - testes manuais. Os testes são feitos no ambiente do usuário. São mais difíceis para o desenvolvedor acompanhar, uma vez que pode haver uma quantidade muito grande de usuários.
Estratégias de teste
Segundo Roger Pressman [PRESSMAN], há várias estratégias de testes existentes e elas fornecem as seguintes características genéricas:
-
As revisões formais são feitas no início.
-
O teste começa no nível de componente e prossegue "para fora", em direção à integração de todo o sistema.
-
Diferentes técnicas de teste são adequadas em diferentes momentos.