Testes de software: como garantir um bom produto
Atualizado: 23 de dez. de 2021

O que é teste de software?
Ninguém gosta de receber um serviço ou produto ruim? Correto? Isso é o básico da garantia de qualidade. É com essa premissa que os times de atuais de desenvolvedores trabalham. E a partir disso, eles elaboram testes de softwares. Que avaliam a funcionalidade e a qualidade do produto em desenvolvimento, antes do seu lançamento.
Através desses testes é possível achar falhas de funcionamento, erros no códigos de programação e verificar se o software realiza as tarefas que ele se propõe resolver. Evitando que clientes tenham uma boa experiência com o produto. E principalmente, nenhum tipo de prejuízo ao usá-lo, devido a falhas.
Dessa maneira, a equipe atende as expectativas do usuário final, em relação ao produto. Ou, por fornecer um serviço tão bom, que ele não iria querer cancelar a assinatura do software.
Pois, é um bom histórico de entregas, que aumenta a relevância de uma equipe no mercado de software. E, a novos clientes, confiança de comprar os produtos ou contratar os serviços do time de desenvolvedores.
Mas o que são estes testes de softwares e como fazê-los? Ao longo do artigo essas perguntas serão respondidas, além de dicas de frameworks para preparar testes seus códigos
O que é testado no software?
Softwares são a parte lógica de um computador. Eles têm o papel de conectar o usuário ao hardware (parte física), de um aparelho eletrônico.
Para produzi-lo, o desenvolvedor de softwares utiliza uma linguagem de programação para escrever o código. É nesse código, deve estar descrito como o software irá funcionar, como ele irá acessar o hardware e realizar as tarefas que o usuário deseja.
Na sua escrita o software possui diversos números de funções e módulos,. Eles têm o papel de realizar tarefas específicas,a partir de um dado de entrada.
As tarefas podem ser as mais variadas possíveis. Como acessar um servidor, realizar uma operação matemática, mudar o formato de um arquivo. Tudo depende do código nela escrito. E geralmente eles são os alvos principais dos testes de software.
Devido ao aumento da demanda de novos softwares, foram criados frameworks e plataformas. Eles são focados em facilitar e agilizar o desenvolvimento de novos softwares.
Há também frameworks feitos para automatizar a realização dos testes de software.A popularidade dos testes automatizados cresceu, devido à maior adoção da cultura ágil. Essa cultura usa metodologias que tornam a entrega de produtos mais rápida, sem cair a qualidade final .
Portanto, como testes de softwares são normalmente repetitivos e podem levar tempo. Sua automatização permite que os programadores foquem em outras partes do desenvolvimento. Também permitem a reutilização do mesmo teste ou ele ser adaptado, para a avaliação de novos softwares.
Assim, uma cultura de testes, alinhada com métodos de habilidades, garantem um ambiente veloz da resolução de problemas e na adaptação de equipe a mudanças no projeto.
Qual o objetivo dos testes e suas etapas?
É necessário entender que os testes de softwares, são realizados em ambientes controlados. Cujos desenvolvedores, os criam para achar erros nos softwares. Leia-se erro, qualquer coisa que faça o software não agir como esperado. Seja realizar uma função incorretamente, não executá-la, utilizar poder computacional acima do previsto ou qualquer outro tipo de mal funcionamento.
Isso deve estar bastante claro! Pois os testes não garantem a ausência de erros, mas sim dizem que erros não foram encontrados. A equipe de desenvolvimento deve se dedicar em criar testes que achem esses erros, antes que o produto seja de fato lançado.
E como são feitos? Geralmente, são estruturados em forma de pirâmide, chamada convencionalmente de pirâmide de testes. Ela é dividida em três partes: Os testes unitários na base, os testes de integração no meio e os testes de ponta-a-ponta ou teste e2e no topo.
Como exemplificado na imagem.

fonte: Creditas Tech
Adiante vamos nos destrinchar mais detalhes sobre cada etapa. Contudo, é necessário ter em mente que a cada nível, o escopo do teste aumenta, sendo o unitário o mais básico, ao de ponta-a-ponta o mais programa inteiro.
Essa caminhada ao longo de todo o código, auxilia a equipe a entender melhor o objetivo do seu projeto, maneiras de aumentar a produtividade e/ ou benefícios do seu produto ou serviço. Assim aumentando a confiabilidade do funcionamento dos seus softwares, tendo uma ideia geral de suas limitações e com a menor quantidade de erros possível.
Agora, vamos falar sobre cada etapa da pirâmide de testes de software.
Teste unitários
Os testes unitários dividem os códigos em suas menores partes possíveis. Geralmente, eles focam em testar se determinada função ou módulo está funcionando corretamente.
Esses testes podem ser feitos manualmente, pelo próprio programador. O processo é feito compilando a nova função ou módulo escrito, verificando o resultado entregue está de acordo com o que era desejado.
Outra maneira, e hoje a mais comum, é usar frameworks de automatização. Nos frameworks para testes unitários, são criados ambientes de testes. Eles são separados do código principal. E, nesses ambientes de testes, cada entrada tem uma saída esperada, relacionada.
Então, a parte do código que se deseja testar. Recebe a entrada padrão e o próprio framework, verifica se a saída fornecida pelo software era a esperada ou não.
Ainda confuso? Vamos pensar numa historinha:
Digamos, que uma equipe está desenvolvendo um software para notas escolares. Nesse software, um programador ficou responsável por escrever uma função chamada conta_de_mais. Ela tem a tarefa de somar dois valores.
Para testar se essa função está funcionando, o programador cria um ambiente de teste. Nele é padronizada uma entrada e uma saída esperada para esse dado.
Para o teste da função conta_de_mais:
Entrada padrão: 6 e 2.
Saída esperada: 8
Esses dados serão entregues a sua função conta_de_mais e como resultado temos:
conta_de_mais recebe 6 e 2 e devolve como saída 10!
Saída 10? É claro que para nós, letrados em matemática, a soma está errada. Entretanto, para o framework, é necessário comparar a saída real com a saída esperada. Assim, em casos de erros, como por exemplo, o programador é alertado. Então, espera-se que ele releia o código da sua função conta_de_mais e ache o erro.
Essa é a principal vantagem do teste unitário. Ele permite que o programador, não perca tempo procurando erros aleatórios, como uma agulha no palheiro. O teste permite que ele vá cirurgicamente onde está a falha e resolva o problema.
Além disso, deseja-se que eles sejam rápidos. Também são muito úteis, para verificar mudanças no código. Permitindo ao programador, realizar testes diversas vezes, encontrar os erros e solucioná-los.
Outro fator em consideração é que dependendo do tamanho da sua unidade
No exemplo, o nosso programador achou um '+2' no meio de sua lógica. Graças ao teste unitário, ele foi retirado a tempo, e a função começou a passar nos testes.
Testes de integração
Nesses testes é verificado se a unidade consegue trabalhar em conjunto com outras unidades ou recursos, como os bancos de dados. Eles são importantes, pois muitas funções ou métodos, precisam receber ou entregar informações, para outras partes de código. E mesmo que eles funcionem isoladamente, pode haver má integração entre unidades, gerando erros.
Apesar de testar várias partes juntas, a finalidade é testar o software como um todo. Mas sim, um recorte do produto final. Vamos voltar ao exemplo anterior.
Digamos que a função conta_de_mais, que já passou nos testes unitários, entretanto precisa acessar o banco de dados escolar, para receber os números que irá somar.
Se ela não conseguir entrar em contato com esse banco, as funções simplesmente não funcionam!
Outro exemplo, continuando com a função conta_ de_mais. Digamos que o resultado da soma deva ser entregue a função média_ponderada. Se a função média_ponderada não tiver acesso ao resultado, o funcionamento do software empaca! Por algum motivo, as funções conta_de_mais e média_ponderada, não conseguem trabalhar juntas.
Os benefícios dos testes de integração, é justamente achar esses tipos de falhas e consertá-las. Garantindo que a comunicação entre as unidades esteja de acordo e que quando sejam compiladas juntas, não apresentem erros.
Esse teste é bastante útil em pontos chaves do desenvolvimento, para assegurar que o código escrito até então, esteja trabalhando como o esperado. Principalmente, em projetos em que vários programadores são responsáveis por escrever partes diferentes do código.

Teste e2e
Também chamado de ponta-a-ponta, ou end-to-end, eles tentam simular o usuário usando o software acabado. É nessa etapa que o produto é colocado de fato à prova.
Nessa etapa é muito comum ser testada a interface do software, procurando erros que passaram despercebidos ou inesperados. Esses testes são mais complexos, pois requerem um tempo maior para serem feitos e um planejamento que tente prever as ações de uma pessoa.
Além disso, o teste visa verificar falhas e erros no software como um todo, verificando se as APIs necessárias estão boas, se as especificações das máquinas são suficientes para o funcionamento do software, a comunicação entre servidores e bancos de dados, entre outras coisas.
Vamos voltar para o nosso exemplo do software de notas escolares.
Iremos supor que ele funcione via página Web. Então, a primeira simulação proposta é verificar se é possível entrar no site. Se for negativo, então o seu bot irá disparar um aviso, te alertando que tem algo errado.
Percebe que se fosse um cliente, pagante de um serviço online, o quão frustrante seria não acessar o software? Os testes visam justamente simular erros ou falhas que possam frustrar o usuário final. E por isso a sua importância, mesmo sendo os mais demorados e um poucos mais difíceis de programar.
Esses testes são mais complexos, quando feitos automatizados, pois requerem a criação de um bot, que irá testar partes específicas da interface do seu sistema. Entretanto, são cruciais para a entrega do produto final, que sejam realizados.
Dicas de Frameworks:
A vários frameworks e plataformas que que podem ser usado para se realizar testes de softwares
Mockito
Mockito é um framework usado para testes unitários. Ele é útil quando quer realizar testes unitários, onde uma unidade precisa de outros recursos para funcionar. Ele cria imitações desses recursos, os mocks.
Vamos voltar ao nosso programador:
Como dito anteriormente, para a função conta_de_mais funcionar, é necessário acessar um banco de dados com as notas dos alunos. Entretanto, eu desejo fazer um teste unitário dessa função, e não um de integração entre a função e o banco de dados da escola.
Para solucionar esse problema, antes de preparar o ambiente de testes, o programador irá criar um mock, do banco de dados. Esse mock, quando usado o ambiente de testes, irá “enganar” a função conta_de_mais, a fornecendo um dado de entrada, no lugar do banco de dados da escola.
Assim, o programador consegue testar o funcionamento da função conta_de_mais de forma isolada.
O Mockito é muito usado em desenvolvimentos que usam frameworks em Java, como vue.js e no cada vez mais popular,o flutter, da gigante Google.
xUnit
O xUnit é uma ferramenta de testes muito utilizada nas plataformas de desenvolvimento, .Net Core e .Net framework. A xUnit permite criar ambientes para testar funções e módulos já salvos na sua biblioteca
Uma vantagem é que ele é capaz de realizar vários testes ao mesmo tempo, ao criar saídas esperadas para cada função do módulo testado. Assim, em uma única compilação, o testador consegue descobrir erros em várias partes do software. E, na condição de erro, o desenvolvedor é notificado da falha, para verificar o código.
Como exemplo, poderia testar as funções conta_de_mais e média_ponderada utilizando o mesmo ambiente de testes. Poupando o tempo do programador.
Postman
É uma API gratuita bastante usada para realizar testes de integração. Nela, suas unidades são carregadas na biblioteca no do API. E ao criar um ambiente de testes automatizados.
Assim, as funções e módulos são chamadas automaticamente e suas saídas reais são comparadas com as saídas esperadas.
No final é entregue um relatório com os resultados de quais integrações foram aprovadas e reprovadas.
Selenium
O Selenium talvez seja o principal framework para testes ponta-a-ponta. A sua principal utilidade é na testagem em páginas web. Dentro do framework, o desenvolvedor programa um ‘bot’ que irá simular um usuário acessando uma página na internet.
O bot pode ser programado através de alguma linguagem de programação como C#, Java e Python, o que permite ter mais informação sobre os resultados encontrados.
Ou podem ser programados a partir de um plugin no seu sistema de navegação, onde ele irá gravar os seus cliques na interface gráfica do seu site e te sinalizará das possíveis falhas.
Conclusão
Entendeu porque os testes de softwares são fundamentais? Eles garantem que o usuário tenha a experiência mais satisfatória do produto, se o software funciona como o esperado e previne que ele sofra devido a falhas e bugs.
Bons desenvolvedores de softwares devem dedicar um tempo para planejar e implementar. Além de estimular a cultura de testes em suas equipes.
E então, quer saber mais sobre programação softwares? Confira mais artigos do nosso blog aqui.