<p><strong>Meta Description:</strong> Aprenda Cucumber e Gherkin: escrever cenários BDD, step definitions, hooks, tags e como implementar desenvolvimento guiado por comportamento.</p>

<hr>
<h2>Cucumber Framework</h2>

<p>Cucumber é uma ferramenta que permite escrever testes em linguagem natural (Gherkin) que são executados automaticamente.</p>

<h3>Instalação</h3>

<pre><code># Ruby
gem install cucumber

<p># Java (Maven)<br><br>    io.cucumber<br>    cucumber-java<br>    7.14.0<br></p>

<p># Python<br>pip install behave</p>

<p># JavaScript<br>npm install @cucumber/cucumber<br></code></pre></p>

<hr>
<h2>Gherkin - Linguagem</h2>

<h3>Estrutura Básica</h3>

<pre><code>Funcionalidade: Login de Usuário
  Como um usuário registrado
  Quero fazer login no sistema
  Para acessar minha conta

<p>Cenário: Login com credenciais válidas<br>    Dado que estou na página de login<br>    Quando preencho o campo email com "usuario@exemplo.com"<br>    E preencho o campo senha com "senha123"<br>    E clico no botão "Entrar"<br>    Então sou redirecionado para o dashboard<br>    E vejo a mensagem "Bem-vindo, usuário"</p>

<p>Cenário: Login com credenciais inválidas<br>    Dado que estou na página de login<br>    Quando preencho o campo email com "invalido@exemplo.com"<br>    E preencho o campo senha com "senhaerrada"<br>    E clico no botão "Entrar"<br>    Então vejo a mensagem de erro "Credenciais inválidas"<br>    E permaneço na página de login<br></code></pre></p>

<h3>Keywords</h3>

<figure class="wp-block-table"><table>
<tr><th>Keyword</th><th>Usage</th></tr>
<tr><td>Funcionalidade</td><td>Nome do recurso</td></tr>
<tr><td>Cenário</td><td>Caso de uso</td></tr>
<tr><td>Dado</td><td>Pré-condição</td></tr>
<tr><td>Quando</td><td>Ação</td></tr>
<tr><td>Então</td><td>Resultado esperado</td></tr>
<tr><td>E</td><td>Adiciona condição</td></tr>
<tr><td>Mas</td><td>Condição negativa</td></tr>
<tr><td>Esquema do Cenário</td><td>Cenário com parâmetros</td></tr>
<tr><td>Exemplos</td><td>Tabela de dados</td></tr>
</table></figure>

<hr>
<h2>Step Definitions</h2>

<h3>Python (Behave)</h3>

<pre><code># features/steps/login_steps.py
from behave import given, when, then
from selenium.webdriver.common.by import By

<p>@given('estou na página de login')<br>def step_impl(context):<br>    context.browser.get('https://exemplo.com/login')</p>

<p>@when('preencho o campo email com "{email}"')<br>def step_impl(context, email):<br>    element = context.browser.find_element(By.ID, 'email')<br>    element.send_keys(email)</p>

<p>@when('preencho o campo senha com "{senha}"')<br>def step_impl(context, senha):<br>    element = context.browser.find_element(By.ID, 'password')<br>    element.send_keys(senha)</p>

<p>@when('clico no botão "{texto}"')<br>def step_impl(context, texto):<br>    buttons = context.browser.find_elements(By.TAG_NAME, 'button')<br>    for button in buttons:<br>        if button.text == texto:<br>            button.click()<br>            break</p>

<p>@then('sou redirecionado para o dashboard')<br>def step_impl(context):<br>    assert 'dashboard' in context.browser.current_url</p>

<p>@then('vejo a mensagem "{texto}"')<br>def step_impl(context, texto):<br>    assert texto in context.browser.page_source<br></code></pre></p>

<h3>Java (Cucumber)</h3>

<pre><code>// src/test/java/steps/LoginSteps.java
package steps;

<p>import io.cucumber.java.pt.*;<br>import org.openqa.selenium.By;<br>import static org.junit.Assert.*;</p>

<p>public class LoginSteps {</p>

<p>WebDriver driver = Hooks.driver;</p>

<p>@Dado("estou na página de login")<br>    public void estouNaPaginaDeLogin() {<br>        driver.get("https://exemplo.com/login");<br>    }</p>

<p>@Quando("preencho o campo email com {string}")<br>    public void preenchoEmail(String email) {<br>        driver.findElement(By.id("email")).sendKeys(email);<br>    }</p>

<p>@Quando("preencho o campo senha com {string}")<br>    public void preenchoSenha(String senha) {<br>        driver.findElement(By.id("password")).sendKeys(senha);<br>    }</p>

<p>@Quando("clico no botão {string}")<br>    public void clicoNoBotao(String texto) {<br>        driver.findElement(By.xpath("//button[text()='" + texto + "']")).click();<br>    }</p>

<p>@Então("sou redirecionado para o dashboard")<br>    public void souRedirecionado() {<br>        assertTrue(driver.getCurrentUrl().contains("dashboard"));<br>    }</p>

<p>@Então("vejo a mensagem {string}")<br>    public void vejoMensagem(String mensagem) {<br>        assertTrue(driver.getPageSource().contains(mensagem));<br>    }<br>}<br></code></pre></p>

<hr>
<h2>Data Tables</h2>

<pre><code>Funcionalidade: Carrinho de Compras

<p>Cenário: Adicionar múltiplos produtos ao carrinho<br>    Quando adiciono os seguintes produtos ao carrinho:<br>      | Produto    | Quantidade | Preço  |<br>      | Camiseta  | 2         | R$49,90|<br>      | Calça     | 1         | R$89,90|<br>      | Tênis     | 1         | R$199,90|<br>    Então o total do carrinho deve ser R$389,70<br></code></pre></p>

<pre><code># 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(',', '.'))

<p># Add to cart logic<br>        add_to_cart(product, quantity)</p>

<p>total += price * quantity</p>

<p>context.expected_total = total<br></code></pre></p>

<hr>
<h2>Hooks</h2>

<pre><code># features/environment.py
from behave import *
from selenium import webdriver

<p>def before_all(context):<br>    """Executa antes de tudo"""<br>    context.browser = webdriver.Chrome()</p>

<p>def after_all(context):<br>    """Executa após tudo"""<br>    context.browser.quit()</p>

<p>def before_scenario(context, scenario):<br>    """Executa antes de cada cenário"""<br>    context.browser.delete_all_cookies()</p>

<p>def after_scenario(context, scenario):<br>    """Executa após cada cenário"""<br>    if scenario.status == 'failed':<br>        # Take screenshot<br>        context.browser.save_screenshot(f'failed_{scenario.name}.png')</p>

<p>def before_step(context, step):<br>    """Executa antes de cada step"""<br>    pass</p>

<p>def after_step(context, step):<br>    """Executa após cada step"""<br>    if step.status == 'failed':<br>        print(f"Step failed: {step.name}")<br></code></pre></p>

<hr>
<h2>Tags</h2>

<pre><code>@smoke @login
Funcionalidade: Login

<p>@critical<br>  Cenário: Login com sucesso<br>    ...</p>

<p>Cenário: Login com falha<br>    ...</p>

<p>@regression<br>Funcionalidade: Carrinho<br>  ...<br></code></pre></p>

<pre><code># Executar apenas com tag
behave --tags=@smoke
behave --tags="not @skip"
behave --tags="@smoke,@login"  # OR
behave --tags="@smoke+@critical"  # AND
</code></pre>

<hr>
<h2>Conclusão</h2>

<p>Cucumber/Gherkin facilita comunicação entre equipes. As chaves são:<br><ol><li><strong>Linguagem de negócio</strong> - Todos entendem</li><br><li><strong>Step definitions</strong> - Conecta Gherkin a código</li><br><li><strong>Hooks</strong> - Setup/teardown</li><br><li><strong>Tags</strong> - Selecionar cenários</li><br><li><strong>Data tables</strong> - Dados complexos</li></ol></p>