TDD: O que acontece antes do primeiro teste de unidade?

17

Entendo principalmente a teoria do TDD, mas não consigo descobrir como começar. Sento-me para escrever um teste de unidade para um projeto pessoal e percebo. . . Não tenho ideia do que estou testando. Quais objetos, que funcionalidade etc.

Por exemplo, digamos que eu queira escrever um aplicativo para ajudar nossa família a gerenciar tarefas de tarefas. Aqui estão algumas perguntas em minha mente: Como faço para passar dessa ideia para o meu primeiro teste? Quanto deve ser decidido antes de começar e quanto descubro depois de começar a escrever testes? Quando tomo decisões como armazenar dados em um arquivo de texto ou em um banco de dados? Devo ter testes de aceitação do usuário antes de começar? Devo ter a interface do usuário projetada? Devo ter uma especificação? (Eu percebo que pelo menos algumas dessas perguntas de exemplo provavelmente estão em uma "área cinza").

Além da pergunta do título sobre como chegar ao primeiro teste de unidade, você também pode dar um exemplo de como seria o primeiro teste de unidade para um projeto como o exemplo de projeto?

Ethel Evans
fonte
5
Eu recomendo completamente a leitura do livro GOOS de Nat Pryce e Steve Freeman ... há ótimas informações sobre como passar um teste de ponta a ponta com uma 'fatia fina' de funcionalidade.
branco

Respostas:

6

Eu gosto de começar com uma lista de recursos e, para cada recurso, escreva as histórias do usuário e, em seguida, para cada história escreva descrições de teste.

Pense um pouco no design, escolha uma descrição de teste e comece a codificar: refator verde-vermelho.

Repita até que todos os testes passem.

Sim, os testes de aceitação devem ser considerados como parte disso, anexados à história apropriada.

Steven A. Lowe
fonte
Eu gosto disso. É um processo muito claro que posso seguir: listar recursos, fazer uma sub-lista de histórias de usuários para cada recurso, fazer uma sub-lista de testes para cada história de usuário. Vou tentar este processo.
Ethel Evans
Estou aceitando isso porque aborda o que eu pessoalmente queria saber, mas recomendo que as pessoas também leiam a resposta (mais votada) de Carl.
Ethel Evans
18

Você descobriu como o TDD é sobre o design desde o início. Antes de escrever seu primeiro teste, você precisa pensar sobre qual será seu primeiro bit de funcionalidade e como seria seu programa se essa funcionalidade estivesse funcionando.

Os desenvolvedores que não usam o TDD também precisam pensar nisso - mas podem "simplesmente mergulhar" e começar a escrever algo, qualquer coisa. Mas "alguma coisa, qualquer coisa" nem sempre está no caminho de entregar o programa que você pensou que estava planejando escrever. O que é? Bem, como seria seu programa se estivesse funcionando? Que testes passaria?

Quero escrever um aplicativo para ajudar nossa família a gerenciar tarefas de tarefas.

Legal. Se esse aplicativo estivesse funcionando, o que faria? Bem, uma tarefa provavelmente poderia ser atribuída a uma pessoa, certo?

Person fred = new Person("fred")
Chore mow = new Chore("mow the lawn");
mow.assignTo(fred);
assertEquals(fred, mow.whoIsAssigned());

Há um começo. Não é o lugar que você precisa começar, nem necessariamente o melhor lugar para começar - mas é um lugar. É algo que você deseja que seu código suporte (embora eu tenha certeza de que pode criar nomes melhores). Comece por aí, observe isso falhar. Faça passar. Limpe. Espuma, enxágüe, repita.

Carl Manaster
fonte
Não amo o exemplo, mas concordo com a premissa; as metodologias de teste primeiro só fazem sentido quando você é capaz e deseja fazer pelo menos algum projeto inicial. Na verdade, você realmente precisa de um modelo de domínio esqueleto, ou pelo menos um pedaço considerável de um.
Aaronaught 15/06
5
Não existe um design direto aqui. Nenhuma das classes no teste ainda precisa existir. O design acontece no teste, ENTÃO eles são criados para fazer o teste passar.
Torbjørn 15/06
Você poderia elaborar sobre "Antes de escrever seu primeiro teste, você precisa pensar em qual será sua primeira parte de funcionalidade e como seria seu programa se essa funcionalidade estivesse funcionando". Quanto devo trabalhar antes de começar? Em que ponto estou projetando demais e perdendo o benefício de permitir que meus testes de unidade conduzam meu design? Suponho que não quero diagramas de classe, que devem ser conduzidos pela refatoração, certo? Mas este exemplo soa como "tenha uma ideia, invista 15 segundos de pensamento e depois faça um teste". Isso é realmente tudo o que eu quero fazer?
Ethel Evans
2
@ Ethel Sim, isso é tudo o que eu recomendaria colocar nele (tanto no exemplo aqui como em geral). Descobrir algo testável, que o direciona para o produto desejado e, em seguida, escreva um teste para ele.
Carl Manaster 15/06
1
Como funciona em equipe é uma questão maior e diferente. E o próprio TDD não tem muito a dizer sobre a coordenação do trabalho em equipe. A programação em pares e o jogo de planejamento podem ajudar nisso; dentro do contexto do que você planejou, o TDD ainda se aplica. jamesshore.com/Agile-Book/the_planning_game.html Scrum também tem algo a dizer sobre como planejar o trabalho de uma equipe.
Carl Manaster
5

Sim, o TDD tem esse problema. É por isso que agora recomendo o Desenvolvimento Orientado a Comportamentos.

Comece manualmente. Anote algo semelhante a uma história de usuário:

  • Como um usuário
  • Quando eu seleciono Adicionar ao carrinho de compras, desejo que o produto seja adicionado de forma transparente em segundo plano
  • Para que eu possa continuar minha experiência de compra ininterruptamente

Agora, quais são os recursos que suportam esse objetivo (a parte 'So that')?

  • Quando um item é adicionado ao carrinho de compras
    • O carrinho de compras do usuário conterá o novo item
    • O total de itens no carrinho aumentará em um
    • O usuário não deve ser redirecionado
    • Uma opção de check-out agora estará disponível
  • Quando há dois itens no carrinho de compras e o usuário escolhe fazer o check-out
    • O usuário será redirecionado para a página de check-out
    • Ambos os itens estarão visíveis

Tudo isso é possível e deve ser verificado manualmente.

Faça isso por um tempo. Então, como um bom desenvolvedor, comece a procurar maneiras de automatizar peças redundantes. Isso varia dependendo da sua plataforma, mas a maioria possui estruturas decentes disponíveis.

O .Net tem WatiN para automatizar a página da Web ou, se você quiser testar uma API, eu recomendaria a adição do Subspec ao xUnit ou MSpec (você também pode fazer isso com qualquer estrutura de teste, apenas essas tornam mais fácil nomear seus testes de uma maneira que apóie esse estilo de pensamento).

Ruby possui pepino para testes de automação e rspec para testes de API de nível inferior

Javascript tem jasmim e qUnit.

ponto ponto Ponto

George Mauer
fonte
Existem clones / alternativas para .NET também pepino: ver esta pergunta StackOverflow
Carson63000
@ Carson63000 Sim, existem, mas eu pessoalmente não vejo muito sentido. Ruby é uma linguagem .Net no IronRuby. Basta criar um projeto IronRuby e usar pepino real.
precisa
Eu amo o BDD e uso o StoryQ. Não se esqueça de mencionar que a história pode ser expandida em senarios com Given / When / Then. Dado que algumas coisas aconteceram Quando eu faço isso e isso Então eu espero isso e isso. Confira a palestra de David Starr sobre isso no TechEd channel9.msdn.com/Events/TechEd/NorthAmerica/2010/DPR302 e também ter um olhar para StoryQ se você estiver usando .net storyq.codeplex.com
Bronumski
3

Como passo dessa ideia para o meu primeiro teste? Quanto deve ser decidido antes de começar e quanto descubro depois de começar a escrever testes?

Divida seu aplicativo em histórias pequenas. ("Como usuário, quero clicar duas vezes em um ícone e iniciar o programa." Ou "Como usuário, quero abrir meu navegador e acessar o programa." Tanto faz.)

Depois, divida a história em algumas tarefas. (por exemplo, crie um projeto no Eclipse, configure um repositório de código) Quando você chegar a uma tarefa de codificação, escreva seu primeiro teste.

Quando tomo decisões como armazenar dados em um arquivo de texto ou em um banco de dados?

Se não tiver certeza, escolha qual delas parecer mais simples e faça isso. (provavelmente o arquivo de texto) Se você perceber que cometeu um erro, refatore. Se seus testes forem bem estruturados, você poderá fazer alterações no back-end e capturar efeitos colaterais indesejados que surgem.

Christopher Bibbs
fonte
3

Estou surpreso que nenhuma das respostas contenha a coisa real que você faz antes de escrever seu primeiro teste, que é criar uma lista de testes . Uma lista de testes é informada pelas fases de redação e design da história mencionadas em outras respostas e é o precursor direto da redação de um teste que você parece estar procurando.

Para obter mais informações sobre TDD, eu recomendaria o Test Driven Development By Example de Kent Beck. Ele também tem um screencast TDD que segue o desenvolvimento de uma biblioteca não trivial em um estilo TDD puro, com explicações de Kent em todas as etapas do processo. Eu acho que é um ótimo exemplo de TDD na prática, mesmo que seja (por necessidade) feito em um ambiente artificial.

Rein Henrichs
fonte
0

Antes do primeiro teste de unidade, você pensa sobre o que deseja que aconteça e, em seguida, pensa em como testaria isso. Em seguida, escreva esse teste, veja se ele falha e implemente algum código para fazê-lo passar.

Enxágüe, repita, etc.

Para mim, é importante pensar em como você testaria isso, e é isso que pode impulsionar seu design.

em branco
fonte