Teste de Software
Teste de software é o processo de execução do software a fim de determinar se ele atingiu suas especificações e funcionou corretamente no ambiente para o qual foi projetado. Tem por objetivo revelar falhas em um produto, para que as causas dessas falhas sejam identificadas e possam ser corrigidas pela equipe de desenvolvimento antes da entrega final. E por essa característica da atividade de teste, é dizemos que sua natureza é “destrutiva”, e não “construtiva”, uma vez que visa o aumento da confiança de um software através da exposição de seus problemas antes de sua entrega ao usuário final.
O conceito de teste de software pode ser compreendido através de uma visão intuitiva ou mesmo de uma maneira formal, uma vez que há várias formas de defini-lo onde a forma simples é testar um software significa verificar através de uma execução controlada se o seu comportamento corre de acordo com o especificado. Onde o objetivo principal desta tarefa é revelar o número máximo de falhas dispondo do mínimo de esforço, mostrando aos que desenvolvem se os resultados estão ou não de acordo com os padrões estabelecidos.
Segundo Craig e Jaskiel apud Barbosa (2000) a atividade de teste é composta por alguns elementos essenciais que auxiliam na formalização desta atividade. Esses elementos são os seguintes:
- Caso de Teste. descreve uma condição particular a ser testada e é composto por valores de entrada, restrições para a sua execução e um resultado ou comportamento esperado.
- Procedimento de Teste. é uma descrição dos passos necessários para executar um caso (ou um grupo de casos) de teste.
- Critério de Teste: serve para selecionar e avaliar casos de teste de forma a aumentar as possibilidades de provocar falhas ou, quando isso não ocorre, estabelecer um nível elevado de confiança na correção do produto. Os critérios de teste podem ser utilizados como:
- Critério de Cobertura dos Testes: permitem a identificação de partes do programa que devem ser executadas para garantir a qualidade do software e indicar quando o mesmo foi suficientemente testado.
- Critério de Adequação de Casos de Teste: quando, a partir de um conjunto de casos de teste, ele é utilizado para verificar se satisfaz os requisitos de teste estabelecidos pelo critério.
- Critério de Geração de Casos de Teste: quando o critério é utilizado para gerar um conjunto de casos de teste adequado para um produto ou função.
Defeitos no desenvolvimento de software
Dentro do processo de desenvolvimento de software, todos os defeitos são humanos e, apesar do uso dos melhores métodos de desenvolvimento, ferramentas ou profissionais, permanecem presentes nos produtos, o que torna a atividade de teste fundamental durante o desenvolvimento de um software. O tamanho do projeto a ser desenvolvido e a quantidade de pessoas envolvidas no processo são dois possíveis fatores que aumentam a complexidade dessa tarefa, e consequentemente aumentam a probabilidade de defeitos. Assim sendo a ocorrência de falhas é inevitável. Mas o que significa dizer que um programa falhou? Basicamente significa que o funcionamento do programa não está de acordo com o esperado pelo usuário. Esse tipo de falha pode ser originado por diversos motivos:
- A especificação pode estar errada ou incompleta;
- A especificação pode conter requisitos impossíveis de serem implementados devido a limitações de hardware ou software;
- A base de dados pode estar organizada de forma que não seja permitido distinguir os tipos de usuário;
- Pode ser que haja um defeito no algoritmo de controle dos usuários.
Os defeitos são introduzidos na transformação de informações entre as diferentes fases do ciclo de desenvolvimento de um software.
Por exemplo simples de ciclo de vida de desenvolvimento de software (vide a figura 1) : os requisitos expressos pelo cliente são relatados textualmente em um documento de especificação de requisitos em seguida esse documento é então transformado em casos de uso, que por sua vez foi o artefato de entrada para o projeto do software e definição de sua arquitetura utilizando diagramas de classes da UML. Logo após esses modelos de projetos foram usados para a construção do software em uma linguagem que não segue o paradigma orientado a objetos. Note que durante todo esse período uma série de transformações foi realizada até chegarmos ao produto final. Nesse meio tempo, defeitos podem ter sido inseridos.
Essa série de transformações resultou na necessidade de realizar testes em diferentes níveis, visando avaliar o software em diferentes perspectivas de acordo com o produto gerado em cada fase do ciclo de vida de desenvolvimento de um software.
Figura 1. Diferentes Interpretações ao longo do ciclo de desenvolvimento de um software
Fonte: CRAIG e JASKIEL apud Barbosa 2000
Níveis de teste de software
O planejamento dos testes deve ocorrer em diferentes níveis e em paralelo ao desenvolvimento do software para tal podemos citar os principais níveis de teste de software são:
- Teste de Unidade: também conhecido como testes unitários, cujo objetivo é explorar a menor unidade do projeto, procurando gerar falhas ocasionadas por defeitos de lógica e de implementação em cada módulo, separadamente.
- Teste de Integração: tem como função básica provocar falhas associadas às interfaces entre os módulos quando esses são integrados para construir a estrutura do software que foi estabelecida na fase de projeto.
- Teste de Sistema: tem por objetivo realizar uma avaliação no software no intuito de encontrar falhas por meio da utilização do mesmo, como se fosse um usuário final. Dessa maneira, os testes são executados nos mesmos ambientes, com as mesmas condições e com os mesmos dados de entrada que um usuário utilizaria no seu dia-a-dia de manipulação do software, checando se o produto satisfaz seus requisitos.
- Teste de Aceitação: são testes que simulam operações de rotina do sistema de modo a verificar se seu comportamento está de acordo com o solicitado.
- Teste de Regressão: Teste de regressão é uma estratégia importante para redução de “efeitos colaterais”. Consiste em se aplicar, a cada nova versão do software ou a cada ciclo, todos os testes que já foram aplicados nas versões ou ciclos de teste anteriores do sistema, podendo ser aplicado em qualquer nível de teste.
Técnicas de teste de software
Existem muitas formas de se testar um software, porém, existem as técnicas que sempre foram muito utilizadas em sistemas desenvolvidos sobre linguagens estruturadas que ainda hoje têm grande valia para os sistemas orientados a objeto.
Apesar de os paradigmas de desenvolvimento serem diferentes, o objetivo principal destas técnicas continua a ser o mesmo encontrar falhas no software.
As técnicas de teste são classificadas de acordo com a origem das informações utilizadas para estabelecer os requisitos de teste. Elas contemplam diferentes perspectivas do software e impõe-se a necessidade de se estabelecer uma estratégia de teste que contemple as vantagens e os aspectos complementares dessas técnicas. As técnicas existentes são: técnica funcional e estrutural.
Técnica Estrutural (ou teste caixa-branca)
Técnica de teste que avalia o comportamento interno do componente de software, técnica que trabalha diretamente sobre o código fonte do componente de software para avaliar aspectos tais como: teste de condição, teste de fluxo de dados, teste de ciclos e teste de caminhos lógicos.
Nesta técnica de teste, os aspectos a ser avaliados dependem da complexidade e da tecnologia que determinarem a construção do componente de software. O testador tem acesso ao código fonte da aplicação e pode construir códigos para efetuar a ligação de bibliotecas e componentes. Este tipo de teste é desenvolvido analisando-se o código fonte e elaborando-se casos de teste que cubram todas as possibilidades do componente de software.
Teste Funcional (ou teste caixa-preta)
É uma técnica de teste na qual o componente de software a ser testado é abordado como se fosse uma caixa-preta, ou seja, não considerando o comportamento interno do mesmo. Nesta técnica os dados de entrada são fornecidos, o teste é executado e o resultado é comparado a um resultado esperado previamente conhecido. Neste caso o teste terá sucesso se o resultado obtido for igual ao esperado. Podemos testar um método, uma função interna, um programa, um componente, um conjunto de programas e/ou componentes ou mesmo uma funcionalidade. A técnica de teste funcional é aplicável a todos os níveis de teste.
Um conjunto de critérios de teste pode ser aplicado aos testes funcionais podemos chamar de:
- Particionamento em classes de equivalência
Esse critério divide o domínio de entrada de um programa em classes de equivalência, a partir das quais os casos de teste são derivados. Tem por objetivo minimizar o número de casos de teste, selecionando apenas um caso de teste de cada classe. Uma classe de equivalência representa um conjunto de estados válidos e inválidos para uma condição de entrada.:
Devemos seguir tais passos para geração dos testes usando este critério:
1. Identificar classes de equivalência (é um processo heurístico)
- condição de entrada
- válidas e inválidas
2. Definir os casos de teste
- enumeram-se as classes de equivalência
- casos de teste para as classes válidas
- casos de teste para as classes inválidas
Esse critério de teste explora os limites dos valores de cada classe de equivalência para preparar os casos de teste. Se uma condição de entrada especifica uma faixa de valores limitada em a e b, casos de teste devem ser projetados com valores a e b e imediatamente acima e abaixo de a e b.
Esse critério de teste verifica o efeito combinado de dados de entrada. As causas (condições de entrada) e os efeitos (ações) são identificados e combinados em um grafo a partir do qual é montada uma tabela de decisão, e a partir desta, são derivados os casos de teste e as saídas).
O teste de software é uma das atividades mais custosas do processo de desenvolvimento de software, pois pode envolver uma quantidade significativa dos recursos de um projeto. O rigor e o custo associado a esta atividade dependem principalmente da criticalidade da aplicação a ser desenvolvida. Diferentes categorias de aplicações requerem uma preocupação diferenciada com as atividades de teste.
Um ponto bastante importante para a viabilização da aplicação de teste de software é a utilização de uma infraestrutura adequada. Realizar testes não consiste simplesmente na geração e execução de casos de teste, mas envolvem também questões de planejamento, gerenciamento e análise de resultados. Apoio ferramental para qualquer atividade do processo de teste é importante como mecanismo para redução de esforço associado à tarefa em questão, seja ela planejamento, projeto ou execução dos testes. Após ter sua estratégia de teste definida, tente buscar por ferramentas que se encaixem na sua estratégia. Isso pode reduzir significantemente o esforço de tal tarefa.
Além disso, é importante ressaltar que diferentes tipos de aplicações possuem diferentes técnicas de teste a serem aplicadas, ou seja, testar uma aplicação web envolve passos diferenciados em comparação aos testes de um sistema embarcado. Cada tipo de aplicação possui características especificas que devem ser consideradas no momento da realização dos testes. O conjunto de técnicas apresentado neste artigo cobre diversas características comuns a muitas categorias de software, mas não é completo.