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.
- Abra o Eclipse.
- Clique no menu File / New / Maven Project
- Deixe os valores padrão e clique em Next
- Utilize o archetype quickstart (padrão) e clique em Next
- Configure os parâmetros do projeto
- Group Id: com.maxidica.tdd
- Artifact Id: calculadora
- Deixe os demais campos padrão
- Clique no botão Finish
Ajustando pom.xml
Agora vamos incluir as dependências necessárias para o projeto.
- Abra o arquivo pom.xml
- Clique na aba Dependencies
- Remova o junit 3.8.1
- Adicione o junit 4 (4.1.2)
- Adicione as dependências do Cucumber
- cucumber-java
- cucumber-junit
- cucumber-picocontainer
- Configure as dependências com escopo test
Criando arquivo de estórias
Iremos criar o diretório de fonte, chamado resource.
- Clique com o botão direito no projeto
- Escolha New / Source Folder
- Digite src/test/resource
- 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.
- Clique com o botão direito em src/test/java
- Escolha New / Class
- Digite CalcRunner
- 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.
- Clique com o botão direito em src/test/resource
- Escolha New / File
- Digite o nome Calc.feature
- 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.
- Clique com o botão direito na classe CalcRunner.java
- Escolha Run As / JUnit Test
- 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.
- Clicar com o botão direito em src/test/java
- Escolher New / Class
- Defina o nome como CalcSteps
- 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.
- Clique com o botão direito em src/main/java
- Escolha New / Class
- 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.
- Clique com o botão direito na classe CalcRunner.java
- Escolha Run As / JUnit Test
- 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.
- Edite o arquivo Calc.feature
- Altere o texto, eu devo ver o resultado como ‘3’
- Salve o arquivo
- Rode o teste na classe CalcRunner.java
- 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.