Cucumber Framework
Cucumber é uma ferramenta que permite escrever testes em linguagem natural (Gherkin) que são executados automaticamente.
Instalação
# Ruby
gem install cucumber
# Java (Maven)
io.cucumber
cucumber-java
7.14.0
# Python
pip install behave
# JavaScript
npm install @cucumber/cucumber
Gherkin – Linguagem
Estrutura Básica
Funcionalidade: Login de Usuário
Como um usuário registrado
Quero fazer login no sistema
Para acessar minha conta
Cenário: Login com credenciais válidas
Dado que estou na página de login
Quando preencho o campo email com "[email protected]"
E preencho o campo senha com "senha123"
E clico no botão "Entrar"
Então sou redirecionado para o dashboard
E vejo a mensagem "Bem-vindo, usuário"
Cenário: Login com credenciais inválidas
Dado que estou na página de login
Quando preencho o campo email com "[email protected]"
E preencho o campo senha com "senhaerrada"
E clico no botão "Entrar"
Então vejo a mensagem de erro "Credenciais inválidas"
E permaneço na página de login
Keywords
| Keyword | Usage |
|---|---|
| Funcionalidade | Nome do recurso |
| Cenário | Caso de uso |
| Dado | Pré-condição |
| Quando | Ação |
| Então | Resultado esperado |
| E | Adiciona condição |
| Mas | Condição negativa |
| Esquema do Cenário | Cenário com parâmetros |
| Exemplos | Tabela de dados |
Step Definitions
Python (Behave)
# features/steps/login_steps.py
from behave import given, when, then
from selenium.webdriver.common.by import By
@given('estou na página de login')
def step_impl(context):
context.browser.get('https://exemplo.com/login')
@when('preencho o campo email com "{email}"')
def step_impl(context, email):
element = context.browser.find_element(By.ID, 'email')
element.send_keys(email)
@when('preencho o campo senha com "{senha}"')
def step_impl(context, senha):
element = context.browser.find_element(By.ID, 'password')
element.send_keys(senha)
@when('clico no botão "{texto}"')
def step_impl(context, texto):
buttons = context.browser.find_elements(By.TAG_NAME, 'button')
for button in buttons:
if button.text == texto:
button.click()
break
@then('sou redirecionado para o dashboard')
def step_impl(context):
assert 'dashboard' in context.browser.current_url
@then('vejo a mensagem "{texto}"')
def step_impl(context, texto):
assert texto in context.browser.page_source
Java (Cucumber)
// src/test/java/steps/LoginSteps.java
package steps;
import io.cucumber.java.pt.*;
import org.openqa.selenium.By;
import static org.junit.Assert.*;
public class LoginSteps {
WebDriver driver = Hooks.driver;
@Dado("estou na página de login")
public void estouNaPaginaDeLogin() {
driver.get("https://exemplo.com/login");
}
@Quando("preencho o campo email com {string}")
public void preenchoEmail(String email) {
driver.findElement(By.id("email")).sendKeys(email);
}
@Quando("preencho o campo senha com {string}")
public void preenchoSenha(String senha) {
driver.findElement(By.id("password")).sendKeys(senha);
}
@Quando("clico no botão {string}")
public void clicoNoBotao(String texto) {
driver.findElement(By.xpath("//button[text()='" + texto + "']")).click();
}
@Então("sou redirecionado para o dashboard")
public void souRedirecionado() {
assertTrue(driver.getCurrentUrl().contains("dashboard"));
}
@Então("vejo a mensagem {string}")
public void vejoMensagem(String mensagem) {
assertTrue(driver.getPageSource().contains(mensagem));
}
}
Data Tables
Funcionalidade: Carrinho de Compras
Cenário: Adicionar múltiplos produtos ao carrinho
Quando adiciono os seguintes produtos ao carrinho:
| Produto | Quantidade | Preço |
| Camiseta | 2 | R$49,90|
| Calça | 1 | R$89,90|
| Tênis | 1 | R$199,90|
Então o total do carrinho deve ser R$389,70
# Step with table
@when('adiciono os seguintes produtos ao carrinho')
def step_impl(context):
total = Decimal('0')
for row in context.table:
product = row['Produto']
quantity = int(row['Quantidade'])
price = Decimal(row['Preço'].replace('R$', '').replace(',', '.'))
# Add to cart logic
add_to_cart(product, quantity)
total += price * quantity
context.expected_total = total
Hooks
# features/environment.py
from behave import *
from selenium import webdriver
def before_all(context):
"""Executa antes de tudo"""
context.browser = webdriver.Chrome()
def after_all(context):
"""Executa após tudo"""
context.browser.quit()
def before_scenario(context, scenario):
"""Executa antes de cada cenário"""
context.browser.delete_all_cookies()
def after_scenario(context, scenario):
"""Executa após cada cenário"""
if scenario.status == 'failed':
# Take screenshot
context.browser.save_screenshot(f'failed_{scenario.name}.png')
def before_step(context, step):
"""Executa antes de cada step"""
pass
def after_step(context, step):
"""Executa após cada step"""
if step.status == 'failed':
print(f"Step failed: {step.name}")
Tags
@smoke @login
Funcionalidade: Login
@critical
Cenário: Login com sucesso
...
Cenário: Login com falha
...
@regression
Funcionalidade: Carrinho
...
# Executar apenas com tag
behave --tags=@smoke
behave --tags="not @skip"
behave --tags="@smoke,@login" # OR
behave --tags="@smoke+@critical" # AND
Conclusão
Cucumber/Gherkin facilita comunicação entre equipes. As chaves são:
- Linguagem de negócio – Todos entendem
- Step definitions – Conecta Gherkin a código
- Hooks – Setup/teardown
- Tags – Selecionar cenários
- Data tables – Dados complexos
