BDD - Desenvolvimento Orientado pelo Comportamento
Published: 2024-07-12 04:37:15

# Desenvolvimento Orientado pelo Comportamento(BDD)

## Introdução ao BDD

Behavior-Driven Development (BDD) é uma abordagem de desenvolvimento de software que incentiva a colaboração entre desenvolvedores, testadores e stakeholders de negócios. O principal objetivo do BDD é garantir que todos os membros da equipe compreendam claramente os requisitos do sistema, descrevendo o comportamento desejado de um aplicativo em uma linguagem natural e acessível a todos os envolvidos.

## Origem e Evolução do BDD

BDD evoluiu a partir do Test-Driven Development (TDD) e foi popularizado por Dan North em 2006. Ele surgiu como uma resposta às dificuldades enfrentadas com TDD, propondo uma abordagem que focasse mais no comportamento esperado do sistema do que nos detalhes técnicos dos testes. Com o tempo, BDD cresceu para incluir uma visão mais ampla da análise ágil e dos testes de aceitação automatizados, unificando pessoas técnicas e de negócios usando uma linguagem comum centrada no comportamento do usuário.

## Princípios Fundamentais do BDD

1. **Colaboração**: Promove a comunicação contínua entre todos os stakeholders.
2. **Linguagem Natural**: Utiliza uma linguagem comum (Gherkin) para descrever requisitos e critérios de aceitação.
3. **Documentação Viva**: Os testes BDD servem como documentação atualizada do comportamento do sistema.
4. **Ciclos Curtos de Feedback**: Facilita a identificação e resolução rápida de problemas por meio de iterações curtas e frequentes.

## Ferramentas Comuns de BDD

- **Cucumber**: Linguagem de especificação: Gherkin. Integra-se com várias linguagens de programação como Ruby, Java, JavaScript. Permite escrever testes em linguagem natural compreensível por todas as partes interessadas.
  
- **SpecFlow**: Versão do Cucumber para .NET. Linguagem de especificação: Gherkin. Integra-se com MSTest, NUnit e xUnit para testes de aceitação.
  
- **JBehave**: Ferramenta de BDD para Java. Linguagem de especificação: Story. Facilita testes de aceitação integrando-se com JUnit.

- **Behat**: Ferramenta de BDD para PHP. Linguagem de especificação: Gherkin. Integrado com bibliotecas PHP como Mink para testes de navegador.

- **Gauge**: Ferramenta leve para criar especificações de teste. Suporta várias linguagens como Java, Ruby, C#, Python. Usa um formato de especificação simples e reusável.

- **Lettuce**: Ferramenta de BDD para Python. Linguagem de especificação: Gherkin. Facilita a escrita de testes de comportamento de forma clara.

- **Concordion**: Ferramenta de BDD para Java. Usa HTML para escrever especificações de teste. Testes são incorporados em documentos HTML.

- **Turnip**: Extensão do Cucumber para Ruby. Linguagem de especificação: Gherkin. Focado em testes de aceitação para aplicações Ruby.

## Implementação do BDD em Projetos

### Passo 1: Definição dos Cenários

Comece identificando os cenários de uso mais importantes e descreva-os em linguagem natural utilizando a estrutura "Dado, Quando, Então".

### Passo 2: Automação dos Testes

Utilize uma ferramenta BDD (como Cucumber) para automatizar os cenários descritos. Isso envolve a criação de "steps" que correspondem a cada etapa dos cenários.

### Passo 3: Integração Contínua

Integre a execução dos testes BDD no seu pipeline de CI/CD. Isso garante que os testes sejam executados regularmente e que o feedback sobre o estado do sistema seja contínuo.

## Tipos de Escrita para BDD

### Método Imperativo

O método imperativo descreve o cenário passo a passo, detalhando ações, nomes de botões e páginas acessadas. É mais utilizado para pessoas que realizam testes manuais e sentem a necessidade de visualizar detalhadamente todos os passos de um cenário.

- **Exemplo**:
    ```gherkin
    Funcionalidade: Compra de Produto

    Cenário: Compra de produto com sucesso
      Dado que o usuário está na página inicial
      Quando ele clica no link "Login"
      E preenche o campo de e-mail com "usuario@exemplo.com"
      E preenche o campo de senha com "senhaSegura123"
      E clica no botão "Entrar"
      Então ele deve ser redirecionado para a página "Minha Conta"
      
      Dado que ele está logado na página "Minha Conta"
      Quando ele pesquisa pelo produto "Smartphone XYZ"
      E clica no botão "Buscar"
      E clica no link do produto "Smartphone XYZ"
      E clica no botão "Adicionar ao Carrinho"
      Então ele deve ver uma mensagem "Produto adicionado ao carrinho"

      Dado que o produto está no carrinho
      Quando ele clica no ícone do carrinho
      E clica no botão "Finalizar Compra"
      E preenche o endereço de entrega
      E escolhe a forma de pagamento "Cartão de Crédito"
      E preenche os dados do cartão
      E clica no botão "Confirmar Compra"
      Então ele deve ver uma mensagem "Compra realizada com sucesso"
    ```

#### Desvantagens do Método Imperativo

1. **Desgaste e Tempo**: A escrita detalhada de cada passo pode ser desgastante e consumir muito tempo.
2. **Rigidez**: Pequenas mudanças na interface exigem uma revisão completa dos cenários, o que pode ser trabalhoso.

### Método Declarativo

O método declarativo foca no comportamento do usuário e descreve os passos de forma mais abstrata, facilitando o entendimento e a manutenção.

- **Exemplo**:
    ```gherkin
    Funcionalidade: Compra de Produto

    Cenário: Compra de produto com sucesso
      Dado que o usuário está na página inicial
      Quando ele faz login no sistema
      E pesquisa e seleciona o produto "Smartphone XYZ"
      E adiciona o produto ao carrinho
      E finaliza a compra com um cartão de crédito
      Então ele deve ver uma mensagem "Compra realizada com sucesso"
    ```

#### Vantagens do Método Declarativo

1. **Simplicidade**: Cenários mais curtos e de fácil compreensão.
2. **Manutenção**: Menos suscetível a mudanças na interface.

### Sintaxe Gherkin

Gherkin é uma Business Readable Domain Specific Language, criada para descrever comportamentos desejados de um software, removendo os detalhes lógicos dos testes de comportamento.

#### Elementos do Gherkin

- **Given (Dado)**: Descrição das condições para o cenário ocorrer.
- **When (Quando)**: Descrição das ações que devem ocorrer quando o cenário for executado.
- **Then (Então)**: Descrição dos resultados esperados.
- **Funcionalidade**: Define o conjunto de comportamento do sistema.
- **Contexto**: Precondição que se repete para todos os cenários da funcionalidade.
- **Cenário**: Identifica um fluxo por meio do comportamento do sistema.
- **Esquema do cenário**: Informa que esse cenário irá utilizar um conjunto de dados para repeti-lo várias vezes com dados diferentes.

## Boas Práticas para a Escrita do BDD

1. **Flexibilidade**: Não há certo ou errado entre os métodos de escrita apresentados; use o que for mais produtivo para o seu time.
2. **Foco no Comportamento do Usuário**: O comportamento do usuário deve ser o centro das atenções.
3. **Escrita em Terceira Pessoa**: Para manter o foco no usuário.
4. **Objetividade**: Cenários objetivos são mais fáceis de manter e menos propensos a falhas.
5. **Colaboração**: Envolva todo o time na escrita do BDD.

## Como Levar a Abordagem BDD para o Seu Time

### Los Tres Amigos

Também conhecido como Power of Three, este processo consiste em reunir o analista de negócios, um desenvolvedor e um QA para construir cenários e histórias coerentes e de valor para o usuário.

- **Analista de negócios**: Foco nas regras de negócio.
- **Desenvolvedor**: Verificação técnica e soluções alternativas.
- **Analista de qualidade**: Levantamento de cenários não imaginados e questionamento de comportamentos adversos.

### BDD Warriors

Um jogo que ensina de forma divertida como escrever cenários coerentes e objetivos utilizando o mínimo de linhas possíveis. Cada jogador recebe cartas com passos diversos (Given, When, Then) e, a cada rodada, complementa o cenário. O objetivo é completar cenários de forma eficaz e aprender a importância do trabalho em equipe na construção dos BDDs.

## Conclusão

Behavior-Driven Development é uma abordagem poderosa que pode melhorar significativamente a qualidade do software e a comunicação entre os membros da equipe. Embora haja desafios na sua implementação, os benefícios superam as dificuldades, resultando em sistemas que melhor atendem às necessidades dos usuários e facilitam a manutenção e evolução contínua.