Cucumber – Exemplo prático de Calculadora

Introdução

Este post tem o objetivo de demonstrar, de forma prática, a metodologia do uso do Cucumber, usando Eclipe e Java.

Aprenda mais sobre o Cucumber aqui.

Criação do Projeto

Vamos criar um projeto Maven Java no Eclipse.

  1. Abra o Eclipse.
  2. Clique no menu File / New / Maven Project
  3. Deixe os valores padrão e clique em Next
  4. Utilize o archetype quickstart (padrão) e clique em Next
  5. Configure os parâmetros do projeto
    1. Group Id: com.maxidica.tdd
    2. Artifact Id: calculadora
    3. Deixe os demais campos padrão
    4. Clique no botão Finish

Ajustando pom.xml

Agora vamos incluir as dependências necessárias para o projeto.

  1. Abra o arquivo pom.xml
  2. Clique na aba Dependencies
  3. Remova o junit 3.8.1
  4. Adicione o junit 4 (4.1.2)
  5. Adicione as dependências do Cucumber
    1. cucumber-java
    2. cucumber-junit
    3. cucumber-picocontainer
    4. Configure as dependências com escopo test

Criando arquivo de estórias

Iremos criar o diretório de fonte, chamado resource.

  1. Clique com o botão direito no projeto
  2. Escolha New / Source Folder
  3. Digite src/test/resource
  4. Clique em Finish

Eliminando classes desnecessárias

Exclua todos os arquivos .java do projeto (App.java e AppTest.java).

Criando a classe CalcRunner

Essa classe é responsável pela execução do teste.

  1. Clique com o botão direito em src/test/java
  2. Escolha New / Class
  3. Digite CalcRunner
  4. Clique em Finish

package com.maxidica.tdd.calculadora;

import org.junit.runner.RunWith;

import cucumber.api.CucumberOptions;
import cucumber.api.junit.Cucumber;

@RunWith(Cucumber.class)
@CucumberOptions(
plugin = {“html:target/cucumber-html-report”, “json:target/cucumber-json-report.json”},
features = “src/test/resource”
)
public class CalcRunner {

}

Criando arquivo feature

Esse arquivo é responsável pela execução dos testes.

  1. Clique com o botão direito em src/test/resource
  2. Escolha New / File
  3. Digite o nome Calc.feature
  4. Digite o conteúdo abaixo
#language: en
Feature: Calc
   Como usuario entrar com 2 valores
   Com objetivo de obter um resultado

   Scenario: Somar
   Given que eu escolha somar
   When eu preencho o primeiro número com o valor '1'
   And eu preencho o segundo número com o valor '1'
   Then eu devo ver o resultado como '2'

 

Rodando o 1º teste

Esse teste criará a estrutura para definirmos a classe de execução.

  1. Clique com o botão direito na classe CalcRunner.java
  2. Escolha Run As / JUnit Test
  3. Na aba Console, aparecerá o resultado com os métodos a serem codificados
1 Scenarios (1 undefined)
4 Steps (4 undefined)
0m0,000s


You can implement missing steps with the snippets below:

@Given("^que eu escolha somar$")
public void que_eu_escolha_somar() throws Throwable {
// Write code here that turns the phrase above into concrete actions
throw new PendingException();
}

@When("^eu preencho o primeiro número com o valor '(\\d+)'$")
public void eu_preencho_o_primeiro_número_com_o_valor(int arg1) throws Throwable {
// Write code here that turns the phrase above into concrete actions
throw new PendingException();
}

@When("^eu preencho o segundo número com o valor '(\\d+)'$")
public void eu_preencho_o_segundo_número_com_o_valor(int arg1) throws Throwable {
// Write code here that turns the phrase above into concrete actions
throw new PendingException();
}

@Then("^eu devo ver o resultado como '(\\d+)'$")
public void eu_devo_ver_o_resultado_como(int arg1) throws Throwable {
// Write code here that turns the phrase above into concrete actions
throw new PendingException();
}

Criar classe com os passos do teste

Agora, iremos criar a classe responsável pela execução dos passos do teste.

  1. Clicar com o botão direito em src/test/java
  2. Escolher New / Class
  3. Defina o nome como CalcSteps
  4. Então, basta copiar os métodos (apresentados no Console) para dentro da classe
package com.maxidica.tdd.calculadora;

import cucumber.api.PendingException;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;

public class CalcSteps {

@Given("^que eu escolha somar$")
public void que_eu_escolha_somar() throws Throwable {
// Write code here that turns the phrase above into concrete actions
throw new PendingException();
}

@When("^eu preencho o primeiro número com o valor '(\\d+)'$")
public void eu_preencho_o_primeiro_número_com_o_valor(int arg1) throws Throwable {
// Write code here that turns the phrase above into concrete actions
throw new PendingException();
}

@When("^eu preencho o segundo número com o valor '(\\d+)'$")
public void eu_preencho_o_segundo_número_com_o_valor(int arg1) throws Throwable {
// Write code here that turns the phrase above into concrete actions
throw new PendingException();
}

@Then("^eu devo ver o resultado como '(\\d+)'$")
public void eu_devo_ver_o_resultado_como(int arg1) throws Throwable {
// Write code here that turns the phrase above into concrete actions
throw new PendingException();
}

}

Criar a aplicação

Essa classe é que conterá as regras de negócio que queremos, neste caso, calcular a soma de números.

  1. Clique com o botão direito em src/main/java
  2. Escolha New / Class
  3. Defina o nome Calc
package com.maxidica.tdd.calculadora;

public class Calc {

public int somar( int a, int b ) {
return a + b;
}

}

Codificando os métodos na classe CalcSteps

Agora, precisamos codificar os métodos.

package com.maxidica.tdd.calculadora;

import static org.junit.Assert.assertEquals;

import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;

public class CalcSteps {

Calc calc;
int num1, num2;

@Given("^que eu escolha somar$")
public void que_eu_escolha_somar() {
calc = new Calc();
}

@When("^eu preencho o primeiro número com o valor '(\\d+)'$")
public void eu_preencho_o_primeiro_número_com_o_valor(int arg1) {
num1 = arg1;
}

@When("^eu preencho o segundo número com o valor '(\\d+)'$")
public void eu_preencho_o_segundo_número_com_o_valor(int arg1) {
num2 = arg1;
}

@Then("^eu devo ver o resultado como '(\\d+)'$")
public void eu_devo_ver_o_resultado_como(int arg1) {
assertEquals(arg1,calc.somar(num1,num2));
}

}

Teste final

Então podemos executar o teste final na classe CalcRunner.

  1. Clique com o botão direito na classe CalcRunner.java
  2. Escolha Run As / JUnit Test
  3. Verifique o resultado no Console
1 Scenarios (1 passed)
4 Steps (4 passed)
0m0,146s

Provocando erro no teste

Para executar a falha, devemos alterar o arquivo feature.

  1. Edite o arquivo Calc.feature
  2. Altere o texto, eu devo ver o resultado como ‘3’
  3. Salve o arquivo
  4. Rode o teste na classe CalcRunner.java
  5. Perceba que no Console, apresentará erro de execução
1 Scenarios (1 failed)
4 Steps (1 failed, 3 passed)
0m0,163s

java.lang.AssertionError: expected:<3> but was:<2>
at org.junit.Assert.fail(Assert.java:88)
at org.junit.Assert.failNotEquals(Assert.java:834)
at org.junit.Assert.assertEquals(Assert.java:645)
at org.junit.Assert.assertEquals(Assert.java:631)
at com.maxidica.tdd.calculadora.CalcSteps.eu_devo_ver_o_resultado_como(CalcSteps.java:31)
at ✽.Then eu devo ver o resultado como '3'(Calc.feature:10)

Essa é a parte interessante do teste. Alterando o arquivo feature, podemos validar se a aplicação está funcionando de forma correta.

Você pode baixar o projeto pronto no Github.

 

Leave a Reply