Aprendendo TDD! O pensamento de Desenvolvimento Guiado por Testes

Uma das partes mais difíceis de fazer TDD é pensar em um código que não existe. Como você chama o método? Como vai fazer as asserções pra garantir que ele funciona?

Na verdade essa reflexão sobre o código que ainda está por vir é que é o maior benefício do TDD! Fazer essas perguntas sem ter tido todo o trabalho de escrever o código é uma grande ajuda.

O que pensamos quando estamos escrevendo o código

Ao escrever o código de produção eu me concentro muito mais no estilo da escrita, no tamanho que o método está ficando, se posso extrair alguma parte desse método etc.

Estamos pensando em fazer certo o código que estamos desenvolvendo. A visão fica mais estreita e muitas vezes coisas óbvias acabam passando totalmente desapercebido, como declarar uma variável chamada p, ou um if else para retornar true ou false.

Isso não é algo ruim, quando estamos escrevendo um código precisamos estar focados. O ponto é ter um balanço entre o foco em algo bem específico e a visão do todo, para garantir que não só estamos resolvendo o problema corretamente como estamos resolvendo o problema correto.

Alguns estudos expõe essa nossa capacidade muito bem. Esse vídeo é um excelente exemplo de exercício de foco: https://www.youtube.com/watch?v=IGQmdoK_ZfY.

O que pensamos quando estamos escrevendo os testes

Quando mudamos nossa atenção para escrever os testes devemos pensar em como o código, que ainda não existe, será utilizado.

Essa mudança de pensamento tem um efeito interessante. Tente responder o seguinte exercício que é bem conhecido nos estudos de psicologia cognitiva:

  • Um taco e uma bola de baseball custam juntos U$1.10.
  • O taco custa um dólar a mais que a bola.
  • Quanto custa a bola?

Se você pensou que a resposta é U$0.10, você errou, mas não está só. Eu também pensei que a resposta seria o mais óbvio, mas se a bola custasse U$0.10, então a soma seria U$1.20.

Escrever testes ajuda a evitar que esse pensamento rápido e focado em resolver o problema na nossa frente acabe por nos fazer errar. Se você tivesse um teste para essa situação, ao colocar o valor da bola como R$0.10, o teste falha e você recebe o feedback. Fabio Pereira explora muito mais esse assunto no capítulo “Psicologia cognitiva explicando Ágil” do livro ThoughtWorks Antologia Brasil.

Desenvolvendo Guiado por Testes

Vamos analisar agora as várias decisões de design que tomamos ao escrever os testes primeiro. Veja o exemplo de teste a seguir:

require 'minitest/autorun'
require 'minitest/spec'
require_relative '../lib/quadro.rb'

describe Quadro do
  it "realiza jogada na posicao especificada" do
    quadro = Quadro.new
    quadro.executar_jogada('x', 1, 1)
    quadro.posicoes[1][1].must_equal 'x'
  end
end

O objeto quadro é responsável por realizar as jogadas, mas precisa receber qual o símbolo será colocado e em qual posição nos eixos x e y. Após a jogada, a matriz que guarda as posições conterá o o símbolo na posição especificada, mas o método em si não retorna nada.

Apesar de ser um teste bem simples, todas essas decisões de design foram tomadas. Ao pensar no teste sem ter o código real escrito temos a oportunidade de visualizar como esse método será utilizado, ao invés de como ele vai funcionar.

Poderíamos, por exemplo, fazer com que o método retorne um booleano que indica se a jogada foi realizada ou não. Ou então, ao invés de passar o símbolo como parâmetro, poderíamos criar dois métodos, um que faz a jogada para o ‘x’ outro para ‘o’. Poderíamos criar um classe Jogador que armazenaria o símbolo.

O ponto principal é, ao escrever o teste antes pensamos em como vamos utilizar o código e não em como vamos fazê-lo. Então ao fazer TDD evite pensar em o que você faria o código e sim em como seria a melhor maneira de utilizá-lo!

Nos próximos posts vamos criar mais testes para nosso projeto de jogo da velha e usá-lo para refletir sobre o design do código. Fique ligado!

Compartilhe os posts da série Aprendendo TDD! com seus amigos e colegas que também estão buscando aprender mais sobre essa técnica. E acompanhe o blog pois toda semana tem post novo! Dúvidas, sugestões e comentário podem ser feitas aqui no blog ou no twitter em @marcosbrizeno.

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s