Gherkin é uma linguagem de especificação estruturada usada para descrever comportamentos esperados de um sistema em linguagem natural. É o formato dos arquivos .feature lidos pelo Cucumber.
Seu objetivo é criar um contrato legível por todos os envolvidos - negócio, QA e desenvolvimento - antes mesmo de qualquer código ser escrito.
Feature: Autenticação de usuários
Scenario: Login com credenciais válidas
Given que existe um usuário cadastrado
When eu faço login com email e senha corretos
Then o sistema deve retornar um token de acesso
And o status code deve ser 200| Keyword | Papel |
|---|---|
Feature |
Agrupa cenários de uma mesma funcionalidade. Descrita em uma linha. |
Scenario |
Um exemplo concreto de comportamento. Deve ser independente. |
Given |
Pré-condição - estado inicial do sistema antes da ação. |
When |
Ação - o que o usuário ou sistema faz. |
Then |
Resultado esperado - o que deve ser verificado. |
And / But |
Encadeia passos do mesmo tipo (Given/When/Then anterior). |
Background |
Passos comuns a todos os cenários de uma Feature. |
Scenario Outline |
Cenário parametrizado com múltiplos conjuntos de dados. |
Examples |
Tabela de dados para o Scenario Outline. |
Usado para evitar repetição de passos Given em todos os cenários de uma Feature.
Feature: Gerenciamento de produtos
Background:
Given que estou autenticado como administrador
Scenario: Cadastrar produto válido
When eu cadastro um novo produto
Then o status code deve ser 201
Scenario: Buscar produto por ID
Given que existe um produto cadastrado
When eu busco o produto pelo ID
Then o status code deve ser 200O Background executa antes de cada cenário, não antes da feature toda.
Permite executar o mesmo cenário com diferentes conjuntos de dados.
Feature: Validação de login
Scenario Outline: Login com dados inválidos
When eu faço login com email "<email>" e senha "<senha>"
Then o status code deve ser <status>
And o campo "message" deve ser "<mensagem>"
Examples:
| email | senha | status | mensagem |
| naoexiste@test.com | senhaerrada| 401 | Email e/ou senha inválidos |
| invalido | 12345678 | 400 | email deve ser um email válido|Cada linha da tabela Examples gera um cenário separado na execução.
Tags são rótulos usados para organizar e filtrar cenários.
@smoke @usuarios
Feature: Gerenciamento de usuários
@critico
Scenario: Cadastrar usuário com dados válidos
When eu cadastro um novo usuário válido
Then o status code deve ser 201
@negativo
Scenario: Cadastrar usuário com email duplicado
Given que existe um usuário cadastrado
When eu tento cadastrar outro usuário com o mesmo email
Then o status code deve ser 400Para filtrar por tag na execução:
gradle test -Dcucumber.filter.tags="@smoke"
gradle test -Dcucumber.filter.tags="@smoke and not @negativo"
gradle test -Dcucumber.filter.tags="@usuarios or @login"Usadas para passar conjuntos de dados estruturados a um step.
Scenario: Cadastrar múltiplos usuários
When eu cadastro os seguintes usuários:
| nome | email | administrador |
| João Silva | joao@test.com | false |
| Maria Admin | maria@test.com | true |No Java, o step recebe um DataTable:
@When("eu cadastro os seguintes usuários:")
public void cadastrarUsuarios(DataTable tabela) {
List<Map<String, String>> rows = tabela.asMaps(String.class, String.class);
for (Map<String, String> row : rows) {
String nome = row.get("nome");
String email = row.get("email");
// ...
}
}Para passar blocos de texto maiores a um step, como um JSON completo.
Scenario: Cadastrar usuário com payload específico
When eu envio o seguinte payload:
"""
{
"nome": "Usuário Teste",
"email": "teste@test.com",
"password": "12345678",
"administrador": "false"
}
"""Por padrão, Gherkin usa inglês. Para escrever em português:
#language: pt
Funcionalidade: Login
Cenário: Login com sucesso
Dado que existe um usuário cadastrado
Quando eu faço login com as credenciais
Então o status deve ser 200Neste projeto os cenários são escritos em português usando as keywords em inglês (Feature, Scenario, Given, When, Then), que o Cucumber aceita independentemente do idioma.
- Um cenário por comportamento - não teste duas regras no mesmo cenário.
- Evite detalhes técnicos:
When eu faço login, nãoWhen eu envio POST para /login. - Cenários devem ser independentes - um não deve depender do resultado de outro.
- Use
Backgroundapenas para contexto que se aplica a TODOS os cenários da Feature. - Nomes de cenários devem descrever o resultado, não o processo.
Notas baseadas no curso de BDD com Java do QAOps.