Relação entre BDD e TDD


30

Qual é a relação do BDD e TDD?

Pelo que entendi, o BDD adiciona duas coisas principais ao TDD: nomeação de testes (garantir / deveria) e testes de aceitação. Devo seguir o TDD durante o desenvolvimento pelo BDD? Se sim, meus testes de unidade TDD devem ser nomeados no mesmo estilo de garantir / deve?


11
BDD é um conjunto de TDDs (Unitests) bem documentados
DD

Alguém quer adicionar uma resposta do campo Behavior Driven Design ? Do meu ponto de vista, essas respostas são sobre as primeiras iterações do BDD. Atualmente, os aplicativos de sucesso do BDD estão mais próximos do design e podem até omitir completamente os testes automatizados, quando apropriado.
Paul Hicks

A diferença entre BDD e TDD é semelhante à diferença entre Macroeconomia e Microeconomia. BDD = construindo um entendimento dos requisitos usando exemplos e, opcionalmente, pode ser usado para conduzir testes automatizados de macro. (agilenoir.biz/en/am-i-behavioral-or-not), TDD = escrevendo microtestes para conduzir a codificação da escrita. O podcast Agile Thoughts também abrange essas diferenças: agilenoir.biz/en/agilethoughts/test-automation-pyramid-series
Lance Kind

Respostas:


37

O BDD adiciona um ciclo ao redor do ciclo TDD.

Então você começa com um comportamento e deixa isso conduzir seus testes, depois deixa os testes conduzirem o desenvolvimento. Idealmente, o BDD é conduzido por algum tipo de teste de aceitação, mas isso não é 100% necessário. Contanto que você tenha o comportamento esperado definido, você estará bem.

Então, digamos que você esteja escrevendo uma Página de Login.

Comece com o caminho feliz:

Given that I am on the login page
When I enter valid details
Then I should be logged into the site
And shown my default page

Essa sintaxe do tipo Dado-e-Quando-E-E-E é comum no desenvolvimento orientado pelo comportamento. Uma das vantagens disso é que ele pode ser lido (e, com treinamento, escrito) por não desenvolvedores - ou seja, seus stakeholders podem visualizar a lista de comportamentos que você definiu para a conclusão bem-sucedida de uma tarefa e ver se ela corresponde às expectativas muito antes de você lançar um produto incompleto.

Existe uma linguagem de script, conhecida como Gherkin, que se parece muito com a acima e permite que você escreva código de teste por trás das cláusulas desses comportamentos. Você deve procurar um tradutor baseado em Gherkin para sua estrutura de desenvolvimento usual. Isso está fora do escopo desta resposta.

Enfim, de volta ao comportamento. Seu aplicativo atual ainda não faz isso (se o faz, por que alguém está solicitando uma alteração?), Então você está reprovando neste teste, esteja usando um corredor de teste ou simplesmente testando manualmente.

Então agora é hora de mudar para o ciclo TDD para fornecer essa funcionalidade.

Esteja você escrevendo BDD ou não, seus testes deverão ter o nome de uma sintaxe comum. Uma das mais comuns é a sintaxe "should" que você descreveu.

Escreva um teste: ShouldAcceptValidDetails. Passe pelo ciclo Vermelho-Verde-Refatorador até ficar satisfeito. Agora passamos no teste de comportamento? Caso contrário, escreva outro teste: ShouldRedirectToUserDefaultPage. Refator vermelho-verde até você ficar feliz. Lave, enxágue, repita até cumprir os critérios estabelecidos no comportamento.

E então passamos para o próximo comportamento.

Given that I am on the login page
When I enter an incorrect password
Then I should be returned to the login page
And shown the error "Incorrect Password"

Agora você não deveria ter antecipado isso para passar seu comportamento anterior. Você deve falhar neste teste neste momento. Então volte ao seu ciclo TDD.

E assim por diante até você ter sua página.

Recomendo o The Rspec Book para aprender mais sobre o BDD e o TDD, mesmo que você não seja um desenvolvedor Ruby.


Você pode simplesmente colocar comentários? Ainda não entendi ...
Honey

4

Minha compreensão disso:

  • O BDD começou como uma rebranding do TDD para tornar o foco no comportamento mais claro.
  • Oferece suporte mais formal (DSL e ferramentas) para um foco no comportamento e nas especificações executáveis.
  • O BDD agora pode ser visto como um superconjunto do TDD. Com o passar do tempo, cresceu para abranger mais aspectos, mas o lado do processo de desenvolvimento é uma parte essencial.

Então, para abordar o TDD feito parte correta do BDD. O BDD começou como uma mudança na linguagem do TDD para tornar clara a intenção do processo. O artigo introdutório de Dan North no BDD explica por que o foco na palavra comportamento, em vez de teste, é útil - ajuda a confirmar que você não está apenas criando o software certo, mas também o software certo. Isso sempre fez parte de uma boa abordagem de TDD, mas Dan a codificou um pouco no BDD.


O que eu acho que o BDD torna um pouco mais explícito que o TDD, ou pelo menos formaliza e fornece suporte para ferramentas, é essa abordagem de dois ciclos / loop duplo / zoom in, zoom out / outside-in. Primeiro, você descreve o comportamento esperado do recurso (o loop externo) e, em seguida, aumenta o zoom no loop interno para lidar com as especificações de baixo nível.

Doubleloop TDD De http://www.metesreau.com/ncraft-workshop/

O Gherkin, em conjunto com ferramentas como Cucumber e SpecFlow, fornece uma maneira de escrever essas especificações de alto nível e, em seguida, vinculá-las ao código que executa o código do aplicativo. Eu diria que é aqui que o BDD pode 'parecer' diferente do TDD, mas ele realmente ainda está fazendo a mesma coisa, apenas com algum suporte adicional à ferramenta e uma DSL. Um pouco mais próximo do TDD 'tradicional', está usando ferramentas como rspec, nspec, spock. Eles se parecem um pouco com o mesmo processo que você faria no TDD 'tradicional', mas com uma linguagem mais focada no comportamento.

No BDD in Action, de John Ferguson Smart (altamente recomendado), ele defende uma abordagem de loop duplo, começando com algo como jBehave nas especificações executáveis ​​de nível externo e, em seguida, adotando uma ferramenta como Spock para as especificações de baixo nível.


O BDD aproxima o conceito de teste das partes interessadas da empresa. O Gherkin foi projetado para ser legível para os negócios, e a idéia de 'documentação viva', ou seja, relatórios de progresso produzidos automaticamente a partir de suas especificações executáveis, é sobre dar feedback às partes interessadas.

Outra parte do BDD agora, que é onde ele genuinamente se torna algo que incorpora o TDD como parte de um processo maior, são os bits e partes de elicitação de requisitos. Ideias como Injeção de Recursos, Mapeamento de Impacto e Opções Reais fazem parte desse lado.

Para a resposta canônica, talvez seja melhor ir para Dan North novamente . Se sua equipe é formada por todos os desenvolvedores, então BDD = TDD. Se sua equipe envolve uma série de partes interessadas, o BDD está mais próximo do XP, com o TDD sendo uma parte dele.


2

Qual é a relação do BDD e TDD?

Eles são a mesma coisa.

Pelo que entendi, o BDD adiciona duas coisas principais ao TDD: nomeação de testes (garantir / deve)

Isso não é realmente algo que o BDD "acrescenta". É apenas uma convenção diferente que visa facilitar o ensino e a compreensão do TDD.

As pessoas que criaram o BDD estavam ensinando TDD e perceberam que a coisa mais difícil de entender era que o TDD não tem absolutamente nada a ver com o teste. Depois que os alunos superaram esse obstáculo, ficou muito mais fácil para eles. Porém, é muito difícil se divorciar de pensar em testar , quando a palavra "teste" (ou terminologia relacionada como "afirmar") aparece praticamente em todos os lugares . Então, eles trocaram algumas palavras.

Mas são apenas as palavras! Não diferença real entre TDD e BDD.

e testes de aceitação.

Os testes de aceitação fazem parte do TDD tão importante quanto o do BDD. Novamente: não há diferença entre TDD e BDD: TDD feito corretamente é BDD, BDD é feito corretamente.


De que maneira os testes de aceitação são uma parte importante do TDD?
SiberianGuy

@ Idsa: eles são importantes, pois seu código não deve passar nos testes que você acha que precisam passar, mas nos que o código deve fazer. Eu acho que muitas pessoas ficam confusas com isso, que a maioria dos testes de unidade é de baixo nível e, assim, evita o difícil problema de testar o que o sistema foi escrito para fazer em geral.
Gbjbaanb

@ Idsa: Da mesma forma que eles são importantes para o BDD, é claro, já que os dois são a mesma coisa ! Os testes de aceitação conduzem o ciclo externo do TDD, aquele que trata de recursos e usuários, em oposição ao ciclo interno mais detalhado, que lida com APIs e protocolos. Eu acho que Kent Beck chama isso de "Zoom In / Zoom Out". Você pode, por exemplo, ver facilmente isso no conjunto de testes JUnit, que provavelmente contém pelo menos tantos testes de aceitação quanto testes de unidade.
Jörg W Mittag

Os testes de aceitação são uma parte importante do TDD e BDD. Mas dizer que BDD é igual a TDD é semelhante a dizer que TDD é igual a teste-primeiro. A menos que você permita que os testes conduzam seu código, você não está fazendo TDD (eu conhecia alguém que estava feliz em escrever testes antecipadamente, mas argumentava que o código sempre deveria ser escrito como seria se você não estivesse escrevendo unidade testes e que os testes devem ser escritos de acordo). Da mesma forma, a menos que você esteja permitindo que o comportamento conduza seus testes, você não está fazendo BDD.
Pdr1

11
@ Idsa: Observe que existem muitas descrições erradas do TDD, que não incluem testes de aceitação. Essas descrições erradas - infelizmente bastante populares e amplamente ensinadas - são uma das razões pelas quais as pessoas do BDD pensaram que seria uma boa ideia renomear o TDD com um nome diferente, para evitar a confusão. No entanto, e não pode ser repetido com bastante frequência, TDD e BDD são exatamente a mesma coisa .
Jörg W Mittag
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.