Essa é a pergunta que sempre ecoa por aí, quando o assunto é qualidade de software. O teste é simplesmente a etapa necessária para fornecer um produto ou serviço de alta qualidade de forma confiável e eficiente. No desenvolvimento do software, são vários os motivos para criar e executar testes, mas vejamos os principais:
Existem várias metodologias, técnicas, níveis e tipos de testes de software utilizados para alcançar a qualidade da solução desenvolvida. Devemos entender os testes como um reforço na qualidade do software.
As metodologias de teste de software auxiliam na execução do processo, criando uma documentação necessária. Vejamos alguns exemplos:
TDD - Test Driven Development
Uma abordagem evolutiva onde o desenvolvedor cria os testes antes de escrever o código funcional necessário, seguindo as seguintes etapas:
Red: início, um teste que falha é escrito para uma determinada funcionalidade.
Green: precisamos fazer o teste passar buscando a solução mais simples primeiramente.
Refactor: deixar o design do código mais legível, eliminando redundância no código e acoplamentos.
BDD - Behavior Driven Development
Com foco no comportamento de uma aplicação, visa integrar regras de negócio com linguagem de programação. Apresenta uma linguagem clara e objetiva como documento final, baseando a sua escrita no Gherkin com o famoso Given-When-Then (Dado-Quando-Então).
Dado uma condição
Quando eu executo uma ação
Então o resultado é esse
Dicas para escrever bons cenários:
Exemplos de ferramentas de BDD:
BDD é um conceito independente de linguagem, existindo implementações para todas as linguagens. Cucumber é a mais conhecida e possui implementação para as linguagens Ruby, Java e outras linguagens, JBehave e Concordion (Java), Behave (Python) e SpecFlow (.NET) também são utilizadas.
Tem como objetivo detectar a presença de erros no sistema testado, reduzindo a probabilidade de erros, retrabalho e prejuízos na qualidade final da entrega.
Caixa Preta (Teste Funcional): orientado a dados, essa técnica é utilizada para verificar a saída dos dados usando diversos tipos de entradas. Avalia o comportamento externo do sistema, pode ser utilizada em todos os níveis de teste.
Caixa Branca (Teste Estrutural): orientado à lógica, essa técnica é utilizada para validar a estrutura, avaliar a qualidade da estruturação e da implementação do código. Avalia o comportamento interno do sistema (métodos, classe e trechos isolados de código).
Caixa Cinza: técnica utilizada para analisar a parte lógica mais a funcionalidade do sistema, fazendo uma comparação com a especificação dos requisitos e o que esta sendo desenvolvido.
Regressão: técnica utilizada para aplicação de versões mais recentes do sistema, que garantem que novos defeitos não surjam em componentes já analisados.
Definem o momento do ciclo de vida do software em que são realizados os testes.
Unidade - Teste de Funcionalidade
O teste unitário tem por objetivo testar a menor parte testável do sistema (unidade) em geral, um método. Deve responder as seguintes perguntas:
O que eu estou testando?
O que o método deveria fazer?
Qual o seu atual retorno?
O que eu espero que retorne?
Integração - Teste de Componentes/serviço
O teste de integração serve para dizer se sua aplicação esta respondendo corretamente ou não. Agrupa os métodos já testados no teste unitário. Tem como objetivo encontrar falhas na integração interna dos componentes do sistema.
Sistema - Teste de perfomance/carga
O Teste de sistema é realizado com o propósito de avaliar a qualidade externa do produto, na medida do possível a qualidade em uso. Agrupa todos os módulos e testa em conjunto com a interface gráfica.
Exploratório - Testes Manuais
O Teste exploratório é realizado em paralelo com outras técnicas, em ambientes pouco testados pelos testes convencionais. É o processo básico que verifica se o software atingiu a necessidade do cliente.
Funcional: Garantem se a regra de negócio esta sendo atendida.
Não-Funcionais: Validam os aspectos tais como: a aparência, a facilidade de uso, a velocidade e a robustez do sistema. Dentre os testes não-funcionais, podemos citar:
Teste de Volume: Verifica se o sistema suporta alto volumes de dados.
Teste de Segurança: Ajudam a garantir o funcionamento da aplicação.
Teste de Desempenho: Verifica se o comportamento para funções de transações ou de negócio.
Teste de Compatibilidade: Valida o funcionamento do sistema em diferentes navegadores e hardwares.
Ao iniciar um projeto, precisamos analisar para compreender quais as metodologias e técnicas de teste utilizar. Ao conhecer as metodologias queremos utilizá-las como regra, e isso não é o correto, pois devemos entender que as metodologias de testes são modelos de aplicação. O planejamento dos testes ajuda nesse processo, pois é elaborado com base nos requisitos, ajudando a focar nas necessidades do projeto.
A automação dos testes garante a redução do tempo gasto com depuração e correção de bug. Tem como objetivo viabilizar o desenvolvimento ágil do software.
Quando uma suíte de testes for lenta em sua execução a tendência é que ela seja negligenciada. Por outro lado, uma suíte rápida pode ser disparada por sua IDE toda vez que salvar um arquivo, por exemplo, dessa forma o feedbak é instantâneo e mais útil.
É importante separar diferentes tipos de testes a serem executados em diferentes fases do desenvolvimento. Testes unitários podem ser executados a qualquer momento pois tendem a serem rápidos, testes de integração por outro lado tendem a depender de recursos externos e têm seu setup mais lento, por isso são melhor aproveitados se executados em ambiente automatizado, posteriormente ao desenvolvimento.
Em resumo diferentes tipos de testes trazem diferentes benefícios, e exigem diferentes condições para serem executados.
Analise e planeje os diferentes tipos de testes no seu projeto, a fim de garantir a qualidade através deles sem comprometer sua produtividade!
https://medium.com/snowman-labs/nunca-havera-tempo-para-testar-26ada09097de
https://percy.io/
https://pt.wikipedia.org/wiki/Teste_de_software