Menu

3 noções básicas essenciais para a criação de uma suíte de automação para aplicativos web

Este artigo foi escrito a fim de compartilhar que existem padrões e ferramentas que, quando combinados, podem oferecer testes automatizados com alto valor de negócio e baixo custo em termos de manutenção do código.

O Cucumber é uma ferramenta que suporta Behavior Driven Development (BDD), que consiste em descrever o comportamento de um usuário. Dessa forma, as necessidades reais do usuário são descritas. Selenium WebDriver é uma ferramenta que simula ações do usuário em navegadores web. Este artigo descreve como usar o Cucumber, juntamente com Selenium WebDriver para implementar testes automatizados com alto valor de negócio e de baixa manutenção.

Cucumber é usado para descrever o valor do negócio em uma linguagem natural, por isso permite que equipes de desenvolvimento de software descrevam como o software deve se comportar em texto simples, escrevendo especificações através de exemplos. Uma boa vantagem de escrever especificações com Cucumber é que qualquer um na equipe consegue ler e entender as especificações em texto simples - de pessoas de negócios a desenvolvedores de software. Além disso, ele ajuda a obter feedback dos stakeholders de negócios sobre se a equipe vai construir a coisa certa antes mesmo de começar. Ele também ajuda a equipe a fazer um esforço intencional para desenvolver uma linguagem ubíqua compartilhada para falar sobre o sistema. Outra vantagem é que a especificação é uma documentação viva, porque apesar de ser escrita em texto simples, origina testes automatizados executáveis, como você verá mais adiante no artigo. A estrutura que o Cucumber usa para as especificações é o formato Given/When/Then em conformidade com gramática da linguagem Gherkin. A parte Given (Dado) descreve uma pré-condição existente do estado de software antes de começar o comportamento que você está especificando. A seção When (Quando) é o próprio comportamento. O Then (Então) descreve o resultado esperado do comportamento. Por exemplo: Dado que me inscrevi para Loja de Livros Online, quando eu acesso a loja com minhas credenciais, então vejo uma mensagem "Bem-vinda à Loja de Livros Online!". Continue lendo para encontrar mais exemplos.

Selenium WebDriver simula as ações do usuário definidas pelas descrições do Cucumber em um browser. Ele é usado para testar automaticamente aplicações web, uma vez que conduz um browser utilizando recursos nativos de cada browser. Selenium ainda é movido por código, de modo que os testes automatizados são escritos em uma linguagem de programação que define as ações do usuário e controla Selenium WebDriver. Há muitas linguagens de programação diferentes que podem ser usadas com Selenium WebDriver, tais como Java, Ruby, Python e JavaScript. No entanto, existe uma linguagem ainda mais simples para descrever cenários de teste: a linguagem natural.

É possível escrever testes automatizados com Cucumber em diferentes linguagens naturais, tais como Português e Inglês, entre mais de 40 outras línguas. Por outro lado, Cucumber não interage diretamente com a aplicação de software. É por isso que é normalmente utilizado em conjunto com ferramentas como o Selenium WebDriver. Desta forma, os testes automatizados servem como documentação, porque podem ser escritos em uma linguagem específica de um domínio e legível do ponto de vista de negócios. Eles também podem ser executáveis, porque possuem a camada do Selenium WebDriver rodando por trás da camada do Cucumber; e pode ser de fácil manutenção porque a camada do Cucumber não precisa saber como as ações do usuário são simuladas, já que este é o trabalho do Selenium WebDriver. Portanto, se a aplicação web muda a forma como o usuário interage com ela, tudo o que precisamos fazer é alterar a camada do Selenium WebDriver e manter a camada do Cucumber como estava. Leia mais para ver exemplos das camadas de Cucumber e Selenium Webdriver.

Existem outras opções de ferramentas para a gestão de casos de teste, tais como TestLink, que armazena os casos de teste escritos em linguagens naturais. Essas ferramentas tendem a ser desconectadas do código real e os testes ficam desatualizados rapidamente. A maior vantagem do Cucumber sobre TestLink é que os testes escritos em texto simples são também testes automatizados, que sempre irão falhar quando a aplicação sai de sincronia com os scripts do Cucumber. Isso ajuda a manter a documentação atualizada, porque falhas na execução notificarão se não estiver. Cucumber também suporta a execução do caso de teste, uma vez que é mais fácil de identificar quais cenários de funcionalidades estão em execução através da leitura de linguagem natural, em vez de ler a linguagem de programação.

Seguem 3 passos para escrever testes automatizados com alto valor de negócio e de baixa manutenção: definir o valor do negócio, automatizar testes e refatorar para baixa manutenção.

Definir o valor do negócio

Seguem alguns princípios de BDD utilizados em Cucumber para de escrever testes automatizados com alto valor de negócio.

É útil escrevê-los em texto puro antes de implementá-los e garantir que as partes interessadas no negócio dêem feedback sobre se os testes descrevem o comportamento correto do software. Se as partes interessadas no negócio derem o feedback após o comportamento do software já ter sido implementado, provavelmente leva muito mais tempo para corrigir o código do que seria necessário para corrigir um texto simples que descreve o teste. Então testes automatizados escritos antes de construir o software trazem valor através da economia de bastante tempo do time de desenvolvimento de software.

Escrever narrativas também traz valor para o teste porque descreve em uma frase qual o motivo de implementar a funcionalidade em primeiro lugar, e ajuda a entender o sobre o que são os cenários da funcionalidade. Por exemplo: Para que eu possa identificar dinossauros, como um colecionador de ossos, eu quero acessar informações sobre os dinossauros.

Outra qualidade importante em testes automatizados valiosos é que o texto simples usa um vocabulário específico do domínio do negócio para que eles sejam compreendidos por qualquer pessoa da equipe: usuários, stakeholders de negócios e o time de desenvolvimento de software. Isso traz valor para a comunicação da equipe, porque faz com que ela desenvolva uma linguagem ubíqua compartilhada para falar sobre o software e focar no negócio em vez de descrever testes usando termos técnicos que são apenas mais uma variante de uma linguagem de programação.

Para ter testes automatizados com alto valor de negócio, Cucumber consiste em uma face de negócio e uma face de tecnologia.

Cucumber book pt
Fonte: Tradução da imagem do livro The Cucumber Book: Behaviour-Driven
Development for Testers and Developers, by Matt Wynne and Aslak Hellesøy

A face de negócio é definida dentro de um arquivo de funcionalidade com a extensão .feature. Ela contém a descrição da funcionalidade e os cenários com os passos escritos em linguagem natural, como o Português. Por exemplo:


Fonte: https://github.com/taisedias/selenium-cucumber

Automatizar testes

A face de negócio por si só não é um teste automatizado executável que exercita a funcionalidade da aplicação (que pode ser um Web, Android ou WebService). A fim de torná-la executável, Cucumber tem uma face de tecnologia que consiste em definições de passo, código de suporte e de biblioteca automação. A definição do passo é implementada utilizando uma linguagem de programação para cada passo do cenário nos arquivos de funcionalidades. Esse código usa uma biblioteca de automação de teste, como Selenium ou Watir (outro exemplo de WebDriver usado com Ruby), para acessar a aplicação e executar os testes automatizados.


Fonte: https://www.slideshare.net/taisedias/cucumber-qanight

O exemplo seguinte mostra a face de tecnologia implementada em Java. Cada método Java é uma definição do passo descrito no arquivo de funcionalidade do exemplo anterior. O corpo do método usa o código de suporte que chama a biblioteca de automação, que chama o Selenium, que contém o WebDriver que, finalmente, vai acessar a aplicação:

Um padrão amplamente utilizado na implementação de testes automatizados é o padrão PageObject, que consiste basicamente em mapeamentos entre os elementos da página da aplicação e uma classe. Ele também define as ações do usuário na página usando seus elementos. O exemplo a seguir é um PageObject LoginPage, que mapea os elementos da página de login (como o campo de nome de usuário, campo de senha e botão), bem como define as ações como logar na página. As ações conduzem o Selenium para acessar e acionar os elementos da LoginPage.

O exemplo a seguir é um PageObject representando a página de login. Esse objeto mapeia seus elementos individuais com seus identificadores para o driver usar. Esse deve ser o único lugar onde o identificador é registrado.

Refatorar para baixa manutenção

Código de teste é código, por isso é tão importante refatorar código de automação de teste quanto refatorar código da aplicação. Caso contrário, os testes vão ser tão difíceis de manter que vai ser melhor jogar tudo fora e começar de novo. Esse é um custo que pode ser evitado se seguirmos algumas dicas que ajudam a reduzir os custos de manutenção do código, arquivos de features e definições de passos.

O uso do padrão PageObject torna mais fácil a manutenção de testes automatizados porque as alterações em elementos de página são apenas alteradas uma vez no PageObject. Arquivos de funcionalidades e definições de passo não possuem informações específicas sobre a página e, portanto, não precisa ser atualizado. Em outras palavras, se qualquer elemento na página de login muda (como caminho de URL ou o nome do botão), a manutenção será feita no LoginPage.java somente, e não haverá necessidade de atualizar o arquivo de funcionalidade (que contém os cenários) e a classe LoginStepDefinition.java.

É importante escrever funcionalidades declarativas, de modo que os cenários sejam descritos como um usuário poderia descrevê-los, o que os torna altamente manuteníveis quando comparados com cenários que descrevem apenas clicar em links e preencher os campos de formulário. Por exemplo:

Outra dica para reduzir o custo de manutenção em cenários de Cucumber, é evitar passos que contêm duas ações, porque um deles pode ser reutilizável em diferentes cenários:

Algumas outras boas práticas que ajudam a manter os testes de Cucumber podem ser encontrada aqui: http://blog.codeship.com/cucumber-best-practices/.

Conclusão

Em suma, este artigo descreve brevemente o uso do Cucumber com Selenium WebDriver para implementar testes automatizados com alto valor de negócio e baixa manutenção usando os padrões BDD e PageObject. Todo o código apresentado está no github. Apesar de termos falado sobre Cucumber e Selenium, existem também outras ferramentas de BDD e WebDriver semelhantes que podem ser combinados para criar uma suíte de automação de alto valor de negócio e de baixa manutenção, desde que você use as práticas sugeridas neste artigo.