Quais são as principais diferenças entre TDD e BDD? [fechadas]

129

O Desenvolvimento Orientado a Testes tem sido a moda na comunidade .NET nos últimos anos. Recentemente, ouvi críticas da comunidade ALT.NET sobre o BDD. O que é isso? O que o torna diferente do TDD?

Eu não
fonte
2
Consulte também programmers.stackexchange.com/q/135218/76176 . Esta questão é mais sobre o tópico lá.
Evan Carroll
TDD é para micro testes. O BDD é para requisitos ou testes de macro. Ouça episódios 1 a 8 sobre o Pyramid Teste e ele vai explicar estes níveis: agilenoir.biz/series/agile-thoughts
Lance Tipo

Respostas:

104

Entendo que o BDD tem mais a ver com especificação do que com teste . Ele está vinculado ao Design Orientado a Domínio (você não ama esses acrônimos * DD?).

Ele está vinculado a uma certa maneira de escrever histórias de usuários, incluindo testes de alto nível. Um exemplo de Tom ten Thij :

Story: User logging in
  As a user
  I want to login with my details
  So that I can get access to the site

Scenario: User uses wrong password

  Given a username 'jdoe'
  And a password 'letmein'

  When the user logs in with username and password

  Then the login form should be shown again

(Em seu artigo, Tom continua executando diretamente essa especificação de teste em Ruby.)

O papa de BDD é Dan North . Você encontrará uma ótima introdução em seu artigo Introducing BDD .

Você encontrará uma comparação de BDD e TDD neste vídeo . Também uma opinião sobre o BDD como "TDD feito corretamente" por Jeremy D. Miller

25 de março de 2013 atualização

O vídeo acima está ausente há um tempo. Aqui está um artigo recente de Llewellyn Falco, BDD vs TDD (explicado) . Acho a explicação dele clara e objetiva.

Christian Lescuyer
fonte
10
O link do vídeo parece ter ficado ruim #
James Nail
1
Christian, qual era o título do vídeo e o nome do orador? para que possamos localizá-lo
smci 15/11/12
1
Acima o link 'Tom Ten Thij' já está morto .. aqui está o vídeo
Kundan Pandit
Aqui é um jogo curto que ensina os principais pontos de BDD: agilenoir.biz/en/am-i-behavioral-or-not
Lance Tipo
16

Para mim, a principal diferença entre BDD e TDD é foco e redação. E as palavras são importantes para comunicar sua intenção.

O TDD direciona o foco para os testes. E como os testes no "velho mundo em cascata" vêm após a implementação, essa mentalidade leva a um entendimento e comportamento incorretos.

O BDD direciona o foco para o comportamento e as especificações e, assim, as mentes das cachoeiras são distraídas. Portanto, o BDD é mais facilmente entendido como prática de design e não como prática de teste.

Juha Pohjalainen
fonte
2
O TDD não tem nada a ver com o ciclo de vida do design de software "em cascata". O TDD é independente do SDLC. A intenção do TDD é escrever a quantidade mínima de código necessária para que um teste seja aprovado. De certa forma, o teste se torna a especificação técnica para o código aderir.
Gavin Baumanis 14/03
1
O TDD é "Teste primeiro" e pode funcionar muito bem com o Agile. Isso não é exato.
Terrance
13

Parece haver dois tipos de BDD.

O primeiro é o estilo original que Dan North discute e que causou a criação das estruturas de estilo xBehave. Para mim, esse estilo é aplicável principalmente a testes de aceitação ou especificações de objetos de domínio.

O segundo estilo é o que Dave Astels popularizou e que, para mim, é uma nova forma de TDD que traz sérios benefícios. Ele se concentra no comportamento, em vez de testar e também em pequenas classes de teste, tentando chegar ao ponto em que você basicamente tem uma linha por método de especificação (teste). Esse estilo é adequado a todos os níveis de teste e pode ser feito usando qualquer estrutura de teste de unidade existente, embora as estruturas mais novas (estilo xSpec) ajudem a focar o comportamento em vez de testar.

Há também um grupo BDD que você pode achar útil:

http://groups.google.com/group/behaviordrivendevelopment/


fonte
7

O Test-Driven Development é uma metodologia de desenvolvimento de software para teste primeiro, o que significa que requer a gravação do código de teste antes de escrever o código real que será testado. Nas palavras de Kent Beck:

O estilo aqui é escrever algumas linhas de código, depois um teste que deve ser executado, ou melhor ainda, escrever um teste que não será executado e, em seguida, escrever o código que a fará executar.

Depois de descobrir como escrever um pequeno pedaço de código, agora, em vez de apenas codificar, queremos obter feedback imediato e praticar "codifique um pouco, teste um pouco, codifique um pouco, teste um pouco". Então, escrevemos imediatamente um teste para isso.

Portanto, o TDD é uma metodologia técnica de baixo nível que os programadores usam para produzir um código limpo que funcione.

Desenvolvimento Orientado a Comportamentos é uma metodologia criada com base no TDD, mas que evoluiu para um processo que não diz respeito apenas a programadores e testadores, mas que lida com toda a equipe e todos os interessados ​​importantes, técnicos e não técnicos. O BDD começou com algumas perguntas simples que o TDD não responde bem: quantos testes devo escrever? O que devo realmente testar - e o que não devo? Quais dos testes que eu escrevo serão de fato importantes para os negócios ou para a qualidade geral do produto e quais são apenas os meus excessos de engenharia?

Como você pode ver, essas questões exigem colaboração entre tecnologia e negócios. As partes interessadas nos negócios e os especialistas em domínio geralmente podem dizer aos engenheiros que tipos de testes parecem úteis - mas apenas se os testes forem de alto nível que lidam com aspectos importantes dos negócios. O BDD chama esses testes de negócios de "exemplos", como em "me diga um exemplo de como esse recurso deve se comportar corretamente" e reserva a palavra "teste" para verificações técnicas de baixo nível, como validação de dados ou integração de APIs de teste. A parte importante é que, embora os testes possam ser criados apenas por programadores e testadores, os exemplos podem ser coletados e analisados ​​por toda a equipe de entrega - por designers, analistas e assim por diante.

Em uma frase, uma das melhores definições de BDD que encontrei até agora é que o BDD é sobre "ter conversas com especialistas em domínio e usar exemplos para obter um entendimento compartilhado do comportamento desejado e descobrir incógnitas". A parte da descoberta é muito importante. À medida que a equipe de entrega coleta mais exemplos, eles começam a entender o domínio dos negócios cada vez mais e, assim, reduzem a incerteza sobre alguns aspectos do produto com os quais precisam lidar. À medida que a incerteza diminui, aumenta a criatividade e a autonomia da equipe de entrega. Por exemplo, agora eles podem começar a sugerir seus próprios exemplos que os usuários de negócios não consideravam possíveis por causa de sua falta de conhecimento técnico.

Agora, é ótimo ter conversas com especialistas em negócios e domínio, mas todos sabemos como isso acaba na prática. Comecei minha jornada com a tecnologia como programador. Como programadores, somos ensinados a escrever código - algoritmos, padrões de design, abstrações. Ou, se você é um designer, é ensinado a projetar- organize informações e crie interfaces bonitas. Porém, quando conseguimos nossos empregos de nível básico, nossos empregadores esperam que "agreguemos valor aos clientes". E entre esses clientes pode ser, por exemplo ... um banco. Mas eu não sabia quase nada sobre operações bancárias, exceto como diminuir eficientemente o saldo da minha conta. Então, eu teria que traduzir de alguma forma o que é esperado de mim em código ... eu teria que construir uma ponte entre o setor bancário e meus conhecimentos técnicos, se eu quisesse agregar algum valor. O BDD me ajuda a construir essa ponte sobre uma base estável de comunicação fluida entre a equipe de entrega e os especialistas em domínio.

Saber mais

Se você quiser ler mais sobre o BDD, escrevi um livro sobre o assunto. “Writing Great Specifications” explora a arte de analisar requisitos e o ajudará a aprender como criar um ótimo processo BDD e a usar exemplos como parte essencial desse processo. O livro fala sobre a linguagem onipresente, coletando exemplos e criando as chamadas especificações executáveis ​​(testes automatizados) a partir dos exemplos - técnicas que ajudam as equipes do BDD a oferecer ótimos softwares dentro do prazo e do orçamento.

Se você estiver interessado em comprar "Writing Great Specifications", poderá economizar 39% com o código promocional 39nicieja2 :)

thion
fonte
6

Eu experimentei um pouco a abordagem do BDD e minha conclusão prematura é que o BDD é adequado para a implementação de casos de uso, mas não nos detalhes subjacentes. O TDD ainda é bom nesse nível.

O BDD também é usado como uma ferramenta de comunicação. O objetivo é escrever especificações executáveis ​​que possam ser entendidas pelos especialistas do domínio.

Thomas Eyde
fonte
2

Parece-me que o BDD é um escopo mais amplo. Isso quase implica que o TDD seja usado, que o BDD é a metodologia abrangente que reúne as informações e os requisitos para o uso, entre outras coisas, de práticas do TDD para garantir feedback rápido.

cavalo pálido
fonte
2

Com o meu conhecimento mais recente em BDD, quando comparado ao TDD, o BDD se concentra em especificar o que acontecerá a seguir, enquanto o TDD se concentra em definir um conjunto de condições e depois analisar a saída.

yoozer8
fonte
2

O desenvolvimento orientado a comportamentos parece se concentrar mais na interação e comunicação entre desenvolvedores e também entre desenvolvedores e testadores.

O artigo da Wikipedia tem uma explicação:

Desenvolvimento orientado a comportamento

Mas não pratico o BDD.

Michael Stum
fonte
2

Considere o principal benefício do TDD ser o design. Deve ser chamado de Design Orientado a Testes. O BDD é um subconjunto do TDD, denominado Behavior Driven Design.

Agora considere uma implementação popular do TDD - Unit Testing. As unidades no teste de unidade são tipicamente um pouco de lógica que é a menor unidade de trabalho que você pode fazer.

Quando você une essas unidades de maneira funcional para descrever o comportamento desejado para as máquinas, precisa entender o comportamento que está descrevendo para a máquina. O Design Orientado a Comportamento se concentra em verificar o entendimento dos implementadores sobre os Casos de Uso / Requisitos / Qualquer que seja, e verifica a implementação de cada recurso. O BDD e o TDD em geral servem ao importante objetivo de informar o design e ao segundo objetivo de verificar a correção da implementação, especialmente quando ela é alterada. O BDD feito corretamente envolve biz e dev (e qa), enquanto o Teste de Unidade (possivelmente visto incorretamente como TDD em vez de um tipo de TDD) é normalmente feito no silo dev.

Eu acrescentaria que os testes BDD servem como requisitos de vida.

phil v
fonte
1

O BDD é amplamente TDD feito da maneira correta. No entanto, há um valor adicional que o BDD oferece. Aqui está um link sobre isso:

BDD é mais do que "TDD feito corretamente"

Neel
fonte
1

Não há diferença entre TDD e BDD. exceto que você pode ler melhor seus testes e usá-los como requisitos. Se você escrever seus requisitos com as mesmas palavras que escreve nos testes BDD, poderá obter do seu cliente alguns dos testes definidos prontos para escrever o código.

Mihai
fonte
1

Diferença entre desenvolvimento orientado a teste (TDD) e desenvolvimento orientado a comportamento (BDD)

  • O BDD se concentra no aspecto comportamental do sistema, e não no
    aspecto de implementação do sistema no qual o TDD se concentra.

  • O BDD oferece uma compreensão mais clara do que o sistema deve fazer
    da perspectiva do desenvolvedor e do cliente. O TDD apenas
    fornece ao desenvolvedor uma compreensão do que o sistema deve fazer.

  • O BDD permite que o desenvolvedor e o cliente trabalhem juntos na análise de requisitos contida no código-fonte do sistema.

rahul patil
fonte
1

Em resumo, há uma grande diferença entre TDD e BDD. No TDD, estamos focados principalmente nos dados de teste. No BDD, nosso foco principal é o comportamento do projeto, para que qualquer pessoa que não seja de programação possa entender a linha de código em nome do título de esse método

saurabh singh
fonte
1

Aqui está o instantâneo rápido:

  • TDD é apenas o processo de testar o código antes de escrevê-lo!

  • DDD é o processo de ser informado sobre o domínio antes de cada ciclo de tocar no código!

  • O BDD é uma implementação do TDD que traz alguns aspectos do DDD!

Snehal Masne
fonte