Exemplos de testes escritos com o Cucumber:
Teste de calculadora clássico retirado do github.
Teste de aceitação do projeto: psy-q/leihs
Teste de aceitação do projeto: psy-q/stizun
Esses testes ajudam muito o projeto. A entrada do teste é usada como documentação do sistema e é um documento executável em comum entre a equipe e o cliente. Como não é desconexo da implementação e, normalmente, executado pelo CI ele não se desatualiza tão frequentemente.
Para os desenvolvedores esse texto é um pouco da expectativa e dá uma ideia do que o cliente quer.
Para o cliente pode ser usado como uma validação das regras explicadas ou desenvolvidas pela equipe.
O Cucumber-JVM é a implementação do Cucumber em Java com suporte as linguagens mais populares da JVM. No post no Aslak Hellesøy criador do Cucumber tem mais detalhes.
Já utilizei o Cucumber em diversos projetos Ruby e sempre gostei muito. Nos próximos Java que eu me envolver é bem provável que o Cucumber-JVM estará lá…
Não conheço a ferramente, mas fiquei interessado.
Mas não entendi direito.
Se a ideia é só ter um texto como documentação, onde entra o java aí?
Por acaso esses testes aí podem virar alguma classe java diretamente desse tal texto?
Falei mais do Cucumber que o Cucumber JVM. O Cucumber JVM pode integrar com várias linguagens da JVM: Java, Groovy, JRuby.
Mas um exemplo vale mais que mil palavras.
Veja trechos de código retirado dos exemplos do Cucumber JVM.
package cucumber.examples.java.websockets;
import cucumber.annotation.en.Given;
import cucumber.annotation.en.Then;
import cucumber.annotation.en.When;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import static org.junit.Assert.assertEquals;
public class TemperatureStepdefs {
private final WebDriver webDriver;
public TemperatureStepdefs(SharedDriver webDriver) {
this.webDriver = webDriver;
}
@Given("^I am on the front page$")
public void i_am_on_the_front_page() {
webDriver.get("http://localhost:" + ServerHooks.PORT);
}
@When("^I enter (.+) Celcius$")
public void i_enter_Celcius(double celcius) {
webDriver.findElement(By.id("celcius")).sendKeys(String.valueOf(celcius));
}
@Then("^I should see (.+) Fahrenheit$")
public void i_should_see_Fahrenheit(double fahrenheit) {
assertEquals(String.valueOf(fahrenheit), webDriver.findElement(By.id("fahrenheit")).getAttribute("value"));
}
}
No caso do Java o interpretador identifica as palavras chaves e procura métodos anotados que casem com texto. Ao encontrar um método anotado para ser executado ele o invoca.
Na prática o que você tem é uma documentação executável mesmo. Na interpretação o Cucumber pode executar blocos de código Java, Ruby, Scala, Clojure…