segunda-feira, 12 de julho de 2010

Testes de Software - Tipos de teste

Falar em testes de software pode ser um tanto subjetivo. Para evitar essa abertura de interpretação, até mesmo porque é um serviço que exige rigor, vamos ver os tipos de teste. Quais são, quais as finalidades e como avaliá-los no processo.

Existem vários tipos de teste, cada um para avaliar uma determinada característica da aplicação.

Testes funcionais - estes são os testes que servem para determinar se a aplicação faz o que se propõe a fazer. Comecei falando deste tipo, porque certamente é o primeiro teste que se passa na cabeça dos programadores.

Como exemplo simples para teste de um sistema de login:
UserPassResultado esperado
válidoválidoLogin bem sucedido
inválidoválidoMensagem de erro
válidoinválidoMensagem de erro

Este é o exemplo mais básico, só para ilustrar. Como veremos adiante, existem outros cenários e casos de uso que aumentam a complexidade da bateria de testes.

Testes de performance - nem sempre este tipo de teste se faz necessário. Eles avaliam o tempo de resposta, ou quantidade de memória usada, ou algum outro parâmetro crítico em função da variação da quantidade de inputs ou requisições. São os famosos benchmarkings e variantes. Veremos mais detalhes num post futuro.

Testes de segurança - Há muito o que se discutir aqui. O que é hacking, o que não é, quais as técnicas, quais as medidas de proteção, como considerar algo como seguro... Responder essas questões básicas que servem de base para os testes é que são o maior desafio, e motivo de discussão.

Teste unitário - quando se procura alguma ferramenta ou alguma informação sobre testes em alguma linguagem específica, isto é geralmente o que se encontra. Testes unitários são testes realizados para cobrir um módulo isolado, uma função, ou um conjunto de funções intimamente relacionadas. São similares aos testes funcionais, só que aqueles podem ser extensos, enquanto estes são direcionados e geralmente curtos. Por serem testes simples, rápidos, e com foco na parte e não no todo, eles são muito importantes, e boa parte dos erros são encontrados através deles.

Teste de requisito - pode soar estranho para quem nunca trabalhou com QA antes, mas aqui está o teste mais fundamental de todos, seja qual for o modelo de desenvolvimento ou aplicação desenvolvida. Testar os requisitos é EXTREMAMENTE IMPORTANTE porque:
1. Evita interpretações dúbias tanto da parte dos desenvolvedores, quanto de quem testa;
2. Decorrente da afirmação acima, facilita o trabalho (e diminui o retrabalho) dos arquitetos, designers e implementadores;
3. Apesar de aumentar o tempo necessário inicial dos trabalhos, o ciclo completo de desenvolvimento é reduzido, reduzindo custos do projeto;
4. Evita a criação de testes desnecessários, ou com expectativa falsa, não só reduzindo o trabalho de testes como também aumentando a produtividade (erros encontrados x numero de testes) em quality assurance.

Revisão de código - tipo de teste feito pelos desenvolvedores. É precedente ao Unit Test, e se faz com a inspeção criteriosa do código. Vale a ressalva que nas metodologias ágeis, onde se programa em dupla, esse tipo de teste é mais comumente feita. Um faz um trecho do código, e o outro revisa.

Teste de cobertura de código - Primo do Unit Test, este tipo de teste visa garantir que todos os possíveis caminhos dentro do código sejam acessados. A principal diferença entre este e o Unit Test, é que este é mais abrangente.

Teste de atomicidade - pouco conhecido, este tipo de teste visa garantir a tipagem de dados. Uma variante deste tipo de teste mais difundida é a Fault Injection Test, onde se introduzem inputs não esperados, geralmente usando caracteres de controle mesclados os inputs normais, e observando o comportamento do sistema.

Teste de integração - testa a integração entre módulos e componentes para checar sua compatibilidade e eventual quebra no fluxo do processo.

Teste de recuperação de falha - tipo de teste feito geralmente em aplicações que funcionam como servidores (servidores HTTP, servidores de bancos de dados), sistemas operacionais e sistemas de arquivos. Neste tipo de teste, o sistema é forçado a falhar de alguma forma, e depois se verifica como ele se recupera de um erro grave, se há perdas de ddos e afins.

Testes de regressão - em softwares que são desenvolvidos em ciclos, esta é uma bateria que é feita ao finaldo ciclo funcional, e onde as funcionalidades anteriores que não foram modificadas são postas à prova, afim de garantir que nenhuma funcionalidade antiga foi alterada.

Teste de instalação - para software que serão distribuídos, este é o teste onde se verifica se a instalação será bem sucedida nas plataformas-alvo.

Testes estáticos - são os testes onde se observam o estado do sistema. Inspeções de códigos, e estabilidade inicial pertencem à esta classe de testes.

Testes dinâmicos - são feitos colocando o sistema para executar, com entradas, e então parando a execução e observando o estado das variáveis. Quem usa o Firebug para depurar javascript, ou o gdb para depurar um código em C++ sabe do que se trata.

Testes manuais - são feitos um a um, com um usuário criando dados e fazendo sua inserção no sistema.

Testes automatizados - é quando se usa algum tipo de ferramenta para auxiliar na execução de testes, agilizando o processo. Testes de performance, segurança, carga, estabilidade e regressão são alguns tipos de teste onde vale a pena usar tecnologias que automatizem o processo de teste. Vale notar que o que garante a qualidade deste tipo de teste (onde milhares, às vezes milhões de testes são rodados de uma única vez) é a massa de dados utilizada no input. Se ela for inválida ou inconsistente, a bateria de nada vale.

Fora do cunho técnico e relacionado com a criação de códigos propriamente ditos, ainda temos outros tipos de teste que podem ser feitos.

Testes de acessibilidade - verifica se o programa é acessível sem o uso de mouse, de tecnologias opcionais (addons), avalia a disposição dos elementos, contraste de cores, tamanho e legibilidade de fontes...

Testes de usabilidade - Verifica se o software é de fácil utilização. É um tipo de teste que quando bem feito e bem trabalhado, pode significar a diferença entre o sucesso e o fracasso de uma aplicação. Card sorting, eye tracking, mouse tracking e simple task são alguns dos tipos de teste de usabilidade.

Testes de internacionalização - verifica se a aplicação se comporta de forma adequada em termos de linguagens e seus padrões (padrão para o formato da data, da hora, da moeda, separador decimal, direção do texto).

Teste de documentação - no caso de produtos voltados à indústria, geralmente se faz o teste da documentação afim de avaliar a qualidade em termos de utilidade da mesma (o usuário consegue as instruções necessárias para efetuar alguma tarefa na documentação?). Alguns sites fazem o teste de suas FAQs.

Se você nunca leu nada antes a respeito sobre Quality Assurance deve ter se assustado com a quantidade de tópicos que temos dentro da área. Nos posts seguintes, vou procurar explicar o que é e como se faz cada tipo de teste, mas lembre-se que assim como segurança, qualidade é algo subjetivo, e devem ser considerados quais são os aspectos mais importantes para dimensionar corretamente o tempo e a verba empregadas nisso.

Se você vai fazer um site com estimativa de visitação máxima de 15 usuários logados simultaneamente, provavelmente não precisa de um ciclo de performance, ao passo que se você está desenvolvendo um software de CAD/CAE/CAM ou modelagem 3D com ray tracer, análises de performance serão tão importantes quanto testes funcionais.

Bom pessoal, é isso. Até a próxima.
----------- keepReading

Nenhum comentário:

Postar um comentário