Blog > Introdução à automação de testes

11/jan

Segundo Cem Kaner, autor do livro "Lessons Learned in Software Testing", o propósito da automação de testes pode ser resumidamente descrito como a aplicação de estratégias e ferramentas tendo em vista a redução do envolvimento humano em atividades manuais repetitivas. A automação possibilita a execução de testes regressivos com maior amplitude e profundidade. Neste artigo discutiremos os conceitos fundamentais e os tipos principais de automação de testes.

Introdução

Segundo Cem Kaner, autor do livro "Lessons Learned in Software Testing", o propósito da automação de testes pode ser resumidamente descrito como a aplicação de estratégias e ferramentas tendo em vista a redução do envolvimento humano em atividades manuais repetitivas. A automação possibilita a execução de testes regressivos com maior amplitude e profundidade. Teste regressivo ou teste de regressão é o termo utilizado para o ciclo de re-teste de uma ou mais funcionalidades, a fim de identificar defeitos introduzidos por novas funcionalidades ou correção de defeitos. A cada novo ciclo de teste, o time de testes normalmente executa os testes das novas funcionalidades e os testes regressivos das demais funcionalidades. Dessa forma, é possível encontrar algum efeito colateral ou instabilidade introduzida pela nova funcionalidade. 

O grande problema ocorre quando em um estágio avançado do desenvolvimento, gasta-se mais tempo executando testes regressivos do que testando as novas funcionalidades. Uma abordagem de testes baseada puramente em testes manuais, normalmente não consegue acompanhar as demandas e o volume de testes ao longo do ciclo de vida de desenvolvimento de software. Freqüentemente o produto é liberado sem que tenha sido completamente testado em virtude de restrições de tempo. A automação de testes quando utilizada corretamente permite a execução ininterrupta de testes regressivos a qualquer hora do dia ou da noite. 

A execução de testes automatizados é sempre mais rápida do que os testes manuais e menos suscetível a erros, afinal, a máquina nunca erra. A decisão de usar uma abordagem de testes baseada em testes automatizados está em franca expansão na atualidade. Uma pesquisa realizada em 2006 pelo Forrester Research Inc, revela que 9% das empresas entrevistadas (empresas do Estados Unidos e Europa) utilizam testes automatizados em todos os esforços de testes e 39% das empresas responderam que utilizam testes automatizados em alguns esforços de testes. 

Nas seções a seguir serão apresentados os principais paradigmas e tipos de testes automatizados, assim como, a comparação das vantagens e desvantagens de cada um deles.

Paradigmas de automação de testes

Existem várias abordagens para a automação de testes. No entanto, neste artigo serão apresentados apenas os paradigmas mais importantes da atualidade. Além disso, o foco deste artigo é automação de testes funcionais, dessa forma, não serão apresentados ou discutidos testes unitários (Unit Tests), automação de testes de desempenho (Performance Testing), entre outros tipos de testes existentes. Os tipos de automação são normalmente agrupados de acordo com a forma como os testes automatizados interagem com a aplicação. Em geral, os tipos de automação são agrupados em dois paradigmas (mas não são limitados a esses):

Baseados na interface gráfica

Nesta abordagem os testes automatizados interagem diretamente com a interface gráfica da aplicação simulando um usuário. Normalmente as ações dos usuários são gravadas (Capture) por meio da ferramenta de testes automatizados. A ferramenta transforma as ações dos usuários em um script que pode ser reproduzido (Playback) posteriormente.

  • Vantagens: Não requer modificações na aplicação para criar os testes automatizados. Também não é necessário tornar a aplicação mais fácil de testar (testabilidade) porque os testes se baseiam na mesma interface utilizada pelos usuários.
  • Desvantagens: Existe uma forte dependência da estabilidade da interface gráfica. Se a interface gráfica mudar, os testes falham. Baixo desempenho para testes automatizados que exigem centenas de milhares de repetições, testes de funcionalidades que realizam cálculos complexos, integração entre sistemas diferentes e assim por diante.

Baseados na lógica de negócio

Nesta abordagem os testes automatizados exercitam as funcionalidades da aplicação sem interagir com a interface gráfica. Normalmente é necessário realizar modificações na aplicação para torna-lá mais fácil de testar (testabilidade). Essas modificações resultam em mecanismos para expor ao mundo exterior as funcionalidades da aplicação (APIs, Interfaces de Linha de Comando, Hooks, etc), como veremos mais adiante. 

A interface gráfica é apenas uma casca (camada) que tem o objetivo de fornecer um meio para a entrada dos dados e apresentação dos resultados. A camada que abriga a funcionalidade e o comportamento da aplicação é a camada de lógica de negócio. Esta abordagem de testes é baseada no entendimento que 80% das falhas estão associados a erros na lógica de negócio.

  • Vantagens: Foco na camada onde existe maior probabilidade de existir erros. Independência das mudanças da interface gráfica. Alto desempenho para testes automatizados que exigem centenas de milhares de repetições, testes de funcionalidades que realizam cálculos complexos, integração entre sistemas diferentes e assim por diante.
  • Desvantagens: Requer grandes modificações na aplicação para expor as funcionalidades ao mundo exterior. Exige profissionais especializados em programação para criar os testes automatizados. Existem poucas ferramentas/frameworks que suportam essa abordagem (normalmente é necessário criar soluções caseiras).

Tipos de Automação de Testes

Conforme mencionado anteriormente, os tipos de automação são normalmente agrupados de acordo com a forma como os testes automatizados interagem com a aplicação, como pode ser observado abaixo:

Baseado na interface gráfica

  • Gravação/Execução (Capture/Playback)
  • Dirigido a dados (Data-Driven)
  • Dirigido à palavra-chave (Keyword-Driven)

Baseado na lógica de negócio

  • Baseado na linha de comando (Command Line Interface)
  • Baseado em API (Application Programming Interface)
  • Test Harness

Nas seções a seguir serão apresentados mais detalhadamente os tipos de testes automatizados.

Gravação/Execução (Capture/Playback)

Nesta abordagem, os testes automatizados são realizados por meio da interface gráfica da aplicação. Normalmente a ferramenta de automação fornece um recurso para gravar (Capture) as ações do usuário enquanto o usuário estiver usando a aplicação. Essas ações são traduzidas para comandos na linguagem de script suportada pela ferramenta de automação, para que então possam ser executadas (Playback) posteriormente. 

Via de regra, esta abordagem não requer modificações na aplicação para criar os testes automatizados. Também não é necessário tornar a aplicação mais fácil de testar (testabilidade) porque os testes se baseiam na mesma interface utilizada pelos usuários. Uma das principais vantagens dessa abordagem é a rapidez e facilidade para criar scripts de teste. Também devemos destacar o fato de que não são necessárias modificações na aplicação para a gravação e posterior reprodução dos testes. 

Além disso, não é necessário tornar a aplicação mais fácil de testar (testabilidade) porque os testes se baseiam na mesma interface utilizada pelos usuários. Em contrapartida, a criação de muitos scripts de teste rapidamente, sem planejamento e conhecimento das melhores práticas da automação de testes, normalmente leva à criação de centenas de scripts com código spaghetti. Ou seja, código confuso com baixa reutilização de rotinas e difícil de dar manutenção. Além disso, nesta abordagem existe uma forte dependência da estabilidade da interface gráfica. Se a interface gráfica mudar, os testes falham.

Dirigido a dados (Data-Driven)

Os testes automatizados dirigidos a dados representam um refinamento dos testes de Gravação/Execução. Basicamente, nesta abordagem, é utilizado um mecanismo para auxiliar a execução de testes que realizam as mesmas ações repetidamente, porém com dados diferentes. Tomemos como exemplo um cadastro de Produtos. 

Digamos que seja necessário criar vários testes a fim de avaliar se a aplicação permite gravar os dados sem que todos os campos tenham sido preenchidos ou preenchidos com dados inválidos. Neste caso, as ações seriam as mesmas, apenas os dados preenchidos nos campos mudariam. Na abordagem de Gravação/Execução, teríamos que capturar e gerar diversos scripts de testes. No entanto, à medida que se queira criar centenas ou milhares de scripts de testes, as coisas começam a se complicar. 

O tempo para gravar os scripts de teste aumenta consideravelmente. Além disso, a complexidade e o tempo para dar manutenção nesses scripts também aumentam exponencialmente. Por meio da criação de testes automatizados dirigidos a dados, os dados deixam de ser constantes dentro dos scripts e tornam-se variáveis o que permite a reutilização de código e torna a manutenção dos scripts mais simples.

Dirigido à palavra-chave (Keyword-Driven)

Esta abordagem foi criada para dar suporte aos testes de aceitação (Acceptance Tests) preconizados por metodologias ágeis, tais como o XP (Extreme Programming). Os testes de aceitação são normalmente definidos pelo usuário final em conjunto com analistas e testadores. A principal função dos testes de aceitação é definir os passos e critérios para aceitar um requisito (ou uma user story). Nesta abordagem, os testes automatizados são realizados por meio da interface gráfica da aplicação. 

No entanto, os testes são baseados em palavras-chaves (keywords). Normalmente a ferramenta de automação oferece um conjunto pré-definido de palavras-chaves para permitir a criação dos testes. Cada palavra-chave é um comando em alto nível (praticamente em linguagem nativa) que representa uma ação do usuário. Dessa forma, os testes são facilmente entendidos (e até escritos) pelos usuários finais em virtude do alto nível de abstração. 

O alto nível de abstração que descomplica a criação dos testes automatizados, até mesmo para usuários finais sem conhecimentos técnicos é, sem dúvida, a principal vantagem dos testes dirigidos à palavra-chave.

Baseado na linha de comando (Command Line Interface)

Uma Interface de Linha de Comando (Command Line Interface - CLI) fornece um mecanismo no qual o usuário pode interagir com a aplicação por meio de um prompt ou shell do sistema operacional. Via de regra, a lógica de negócio da aplicação pode ser exercitada por meio da execução de um conjunto de comandos e parâmetros pré-determinados. A CLI interpreta os comandos e parâmetros, executa a função selecionada e apresenta o resultado. O objetivo da CLI é fornecer uma interface para o mundo exterior que não seja dependente da interface gráfica da aplicação. 

A automação de testes baseada na linha de comando faz uso dessa característica para orquestrar a execução dos testes. Dessa forma, é possível criar scripts shell ou batch para exercitar algumas funcionalidades da aplicação sem que seja necessário utilizar uma interface gráfica. A principal vantagem dessa abordagem é a baixa exigência de modificações na aplicação para expor uma interface de linha de comando para o mundo exterior. 

Normalmente, essas modificações são simples e exigem pouca intervenção no código da aplicação. Por outro lado, as interfaces de linha de comando são pouco flexíveis, principalmente quando é necessário passar parâmetros complexos para executar a funcionalidade.

Baseado em API (Application Programming Interface)

Uma API (Application Programming Interface ou Interface de Programação de Aplicativos) representa um conjunto de operações expostas por uma aplicação a fim de permitir que outras aplicações possam acessar ou consumir as suas funcionalidades. O objetivo de uma API é fornecer uma interface para o mundo exterior que não seja dependente da interface gráfica da aplicação. A automação de testes baseada na API faz uso dessa característica para orquestrar a execução dos testes. 

Em geral as APIs oferecem um mecanismo mais robusto para exercitar as funcionalidades da aplicação, se compararmos com os testes automatizados baseados na linha de comando. Uma API pode expor virtualmente todas as funcionalidades de uma aplicação. Em termos práticos, isto significa que a principal vantagem dessa abordagem é a criação de testes complexos e robustos por meio de uma linguagem de programação de alto nível (Java, C++, C#, etc). 

Por esta razão, os testes automatizados baseados em API viabilizam a criação de testes automatizados com maior profundidade e amplitude, sem que seja necessário interagir com a interface gráfica da aplicação. Os testes automatizados baseados em API representam a evolução natural dos testes automatizados baseados na linha de comando. No entanto, a robustez e a flexibilidade oferecidas por esta abordagem exigem grandes modificações no código da aplicação para criar e expor as APIs ao mundo exterior.

Test Harness

O Test Harness é um tipo de automação de testes baseado na Lógica de Negócio que prega o uso racional e inteligente da automação. O Test Harness pode ser implementado por meio de um pequeno programa construído para testar uma API, uma interface de linha de comando, ou até mesmo ganchos “Hooks” projetados na aplicação para este fim. Um ganho, ou Hook, é uma funcionalidade ou comportamento da aplicação que não tem valor do ponto do vista do usuário final. Normalmente não é documentado nem acessível pela interface gráfica. 

Mas, no entanto, é um recurso que tem a finalidade de tornar a aplicação mais fácil de testar (testabilidade), tanto do ponto de vista do teste manual, quanto do teste automatizado. Nesta abordagem, não importa o meio no qual o teste será realizado (contanto que não ocorra interação com a interface gráfica). O objetivo é exercitar as funcionalidades críticas da aplicação que exigem dezenas e milhares de cálculos ou repetições virtualmente impossíveis (ou demoradas) de serem testadas por meios normais. 

Um Test Harness é a combinação da criação de um pequeno programa utilizando uma linguagem de programação robusta (Java, C++, C#, etc) e a decisão inteligente de criar somente a API ou interface de linha de comando necessária para a realização do teste. Dessa forma, conforme mencionamos anteriormente, este tipo de automação de testes prega o uso racional e inteligente da automação. Em termos práticos, isto significa que os esforços e as modificações requeridas para utilizar o Test Harness são muito menores se compararmos com os testes automatizados baseados em API. 

Além disso, normalmente a velocidade da execução de um Test Harness é substancialmente maior do que outras abordagens, em virtude de que o Test Harness é um pequeno programa especializado apenas em uma única função. O que torna o Test Harness a melhor opção para a realização de testes que exigem centenas de milhares de repetições, testes de funcionalidades que realizam cálculos complexos e assim por diante.

Conclusão

Neste artigo notamos a diversidade das abordagens para a automação de testes. Em resumo, não existe uma solução que sirva para todas as situações. É uma prática comum adotarmos soluções híbridas para atender necessidades diferentes de automação sem, no entanto, eliminar os testes manuais por completo. Testes manuais e automatizados são abordagens de testes diferentes que se reforçam mutuamente.

POSTS RELACIONADOS

AGENDA

CURSOS RELACIONADOS