Artigo do tipo Tutorial
Recursos especiais neste artigo:
Conteúdo sobre Arquitetura.
Autores: Douglas Miranda da Silva, Renan Domingues de Siqueira e Rodrigo Martins Pagliares
Aplicando testes unitários com dublês de teste
Alguma das principais preocupações no desenvolvimento de um software é garantir que ele funcione de maneira correta cumprindo todas as regras pelo qual ele foi desenvolvido. Uma vez que requisitos mudam consideravelmente durante o desenvolvimento, é necessário que o desenvolvedor seja capaz de fazer as alterações necessárias sem medo de que elas possam causar erros inesperados. Com isso, testes são inseridos no processo de desenvolvimento para a garantia da sua qualidade.

Teste de software é o processo de execução de um produto para determinar se ele atingiu suas especificações e funcionou corretamente no ambiente para o qual foi projetado. O seu 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. Por conta dessa característica das atividades de teste, dizemos que sua natureza é “destrutiva”, e não “construtiva”, pois visa ao aumento da confiança de um produto através da exposição de seus problemas, porém antes de sua entrega ao usuário final.

Este artigo estuda técnicas e ferramentas que auxiliam no desenvolvimento de testes automatizados e aplica em um estudo de caso, mostrando como implementar esses testes, as vantagens de utilizá-los e as dificuldades encontradas no decorrer da implementação.

Muitos conceitos fundamentais de como testar um sistema orientado a objetos utilizando testes unitários serão apresentados. Os testes unitários focam em uma única classe. Existem para certificar de que o código funciona. Eles controlam todos os aspectos no contexto em que a classe é testada, através de substituição de colabores reais por dublês.


Em que situação o tema é útil

Algumas das principais preocupações no desenvolvimento de um software são aumentar a garantia da sua qualidade e confiabilidade com menores custos. Uma das maneiras de aumentar as garantias de que um software funciona corretamente é através de testes. Testes não automatizados são normalmente dispendiosos por serem repetitivos, é necessário que o desenvolvedor ou testador execute todo o processo de teste passo a passo para certificar que o software estará funcionando corretamente. Assim, essa é uma tarefa muito propensa a erros.

Testes de software podem ser definidos como o processo de avaliar um sistema ou um componente de um sistema por meios manuais ou automáticos para verificar se ele satisfaz os requisitos especificados ou identificar diferenças entre resultados esperados e obtidos. O objetivo é identificar as falhas de um projeto de software, possibilitando às equipes de desenvolvimento corrigirem as não conformidades antes da entrega do produto final e poder estimar a confiabilidade e a qualidade do produto.

Testes manuais são normalmente dispendiosos por serem repetitivos. É necessário que o desenvolvedor ou testador execute todo o processo de teste passo a passo. Com isso, frameworks para testes foram desenvolvidos em várias linguagens de programação para automatizar o processo que era feito de forma manual através de depuradores. Estes frameworks permitem que os testes sejam escritos apenas uma vez e executados inúmeras vezes. Como os testes automatizados são executados pelo computador, então os resultados são verificados sem falha, e como principal vantagem, executam milhares deles em um curto período de tempo.

Este artigo demonstra como aplicar técnicas de testes unitários para testar sistemas orientados a objetos, isolando suas classes de suas dependências. Para a aplicação dessas técnicas, foi adotado como estudo de caso um sistema de ponto de venda. Este sistema é o PDV ProxyGER. Um sistema PDV é uma aplicação usada (em parte) para registrar vendas e cuidar de pagamentos; é tipicamente usada por lojas de varejo.

O que são testes unitários com dublês de testes?

Testes unitários focam em uma única classe. Eles existem para certificar que o código funciona. Eles controlam todos os aspectos no contexto em que a classe é testada através da substituição de colaboradores reais por dublês. O teste unitário não tem conhecimento de nenhum sistema externo ou outras camadas do próprio sistema. Cada parte deve ser testada de maneira isolada.

A maneira correta de garantir que uma classe está apresentando um comportamento correto é testar seus métodos de maneira isolada. Porém, em sistemas construídos em linguagens orientadas a objetos, diversas classes se relacionam e seus métodos dependem de serviços realizados por métodos de outras classes, o que dificulta o isolamento da mesma de dependências externas. Essas dependências causam as chamadas entradas e saídas indiretas.

As dependências vão afetar diretamente o modo como os testes serão desenvolvidos e para isto, dois conceitos serão apresentados segundo:

· SUT (System Under Test): a parte do sistema que está sendo testada (sistema sobre teste).

· DOC (Depend On Component): qualquer componente exigido pelo SUT para cumprir as suas funções, ou seja, as suas dependências.

Os dublês de testes são adicionados no código para aumentar o controle sobre as entradas e saídas indiretas. Eles fingem serem os colaboradores e seu comportamento é determinado pelo programador de maneira mais conveniente para a realização dos testes. Assim é mais fácil garantir a eficácia dos testes e a confiabilidade do sistema.

Porque utilizar testes automatizados?

Certificar que sistemas de software estão cumprindo todas as regras e o propósito pelo qual ele foi desenvolvido é um grande desafio devido à alta complexidade dos sistemas e às inúmeras dificuldades relacionadas ao processo de desenvolvimento. Tais dificuldades envolvem questões humanas, técnicas e de regras de negócio.

...
Quer ler esse conteúdo completo? Tenha acesso completo