Esboço de pepino e cenário
1. Introdução
Pepino é uma estrutura de teste BDD (Behavioral Driven Development).
Usar a estruturato write repetitive scenarios com diferentes permutações de entradas / saídas pode consumir muito tempo, ser difícil de manter e, claro, frustrante.
A Cucumber veio com uma solução para reduzir esse esforço usando o conceito deScenario Outline coupled with Examples. Na seção abaixo, tentaremos dar um exemplo e ver como podemos minimizar esse esforço.
Se você quiser ler mais sobre a abordagem e a linguagem Gherkin, dê uma olhada emthis article.
2. Adicionando Suporte de Pepino
Para adicionar suporte ao Cucumber em um projeto Maven simples, precisaremos adicionar as seguintes dependências:
info.cukes
cucumber-junit
1.2.5
test
info.cukes
cucumber-java
1.2.5
test
org.hamcrest
hamcrest-library
1.3
test
Links úteis para dependências do Maven Central:cucumber-junit,cucumber-java,hamcrest-library
Uma vez que essas são bibliotecas de teste, elas não precisam ser enviadas com as implementáveis reais - é por isso que todas têm escopotest.
3. Um exemplo simples
Vamos demonstrar uma maneira inchada e concisa de escrever arquivos em destaque. Vamos primeiro definir a lógica para a qual queremos escrever um teste:
Vamos primeiro definir a lógica para a qual queremos escrever um teste:
public class Calculator {
public int add(int a, int b) {
return a + b;
}
}
4. Definindo Testes de Pepino
4.1. Definindo um arquivo de característica
Feature: Calculator
As a user
I want to use a calculator to add numbers
So that I don't need to add myself
Scenario: Add two numbers -2 & 3
Given I have a calculator
When I add -2 and 3
Then the result should be 1
Scenario: Add two numbers 10 & 15
Given I have a calculator
When I add 10 and 15
Then the result should be 25
Como visto aqui, duas combinações diferentes de números foram colocadas para testar aqui a lógica de adição. Além dos números, todos os cenários são exatamente os mesmos.
4.2. Código de “cola”
Para testar esses cenários, é essencial definir cada etapa com o código correspondente, a fim de traduzir uma declaração em um pedaço funcional de código:
public class CalculatorRunSteps {
private int total;
private Calculator calculator;
@Before
private void init() {
total = -999;
}
@Given("^I have a calculator$")
public void initializeCalculator() throws Throwable {
calculator = new Calculator();
}
@When("^I add (-?\\d+) and (-?\\d+)$")
public void testAdd(int num1, int num2) throws Throwable {
total = calculator.add(num1, num2);
}
@Then("^the result should be (-?\\d+)$")
public void validateResult(int result) throws Throwable {
Assert.assertThat(total, Matchers.equalTo(result));
}
}
4.3. Aula de corredor
Para integrar os recursos e o código de cola, podemos usar os corredores JUnit:
@RunWith(Cucumber.class)
@CucumberOptions(
features = { "classpath:features/calculator.feature" },
glue = {"com.example.cucumber.calculator" })
public class CalculatorTest {}
5. Reescrevendo recursos usando contornos de cenário
Vimos na Seção 4.1. como definir um arquivo de recurso pode ser uma tarefa demorada e mais propensa a erros. O mesmo arquivo de recurso pode ser reduzido a apenas algumas linhas usando oScenario Outline:
Feature: Calculator
As a user
I want to use a calculator to add numbers
So that I don't need to add myself
Scenario Outline: Add two numbers &
Given I have a calculator
When I add and
Then the result should be
Examples:
| num1 | num2 | total |
| -2 | 3 | 1 |
| 10 | 15 | 25 |
| 99 | -99 | 0 |
| -1 | -10 | -11 |
Ao comparar umScenario Definition regular comScenario Outline, os valores não precisam mais ser codificados nas definições de etapas. Os valores são substituídos por parâmetros como<parameter_name> na própria definição da etapa.
No final do esboço do cenário, os valores são definidos em um formato de tabela delimitado por barras verticais usandoExamples.
Uma amostra para definirExamples é mostrada abaixo:
Examples:
| Parameter_Name1 | Parameter_Name2 |
| Value-1 | Value-2 |
| Value-X | Value-Y |
6. Conclusão
Com este artigo rápido, mostramos como os cenários podem ser genéricos por natureza. E também reduza o esforço de escrever e manter esses cenários.
O código-fonte completo deste artigo pode ser encontradoover on GitHub.