Codeblox Blog

O que é e qual é a importância do TDD?

Thomaz
25/06/2021

O que é TDD?

Você está trabalhando em um sistema complexo. A alteração em um módulo acaba causando efeitos inesperados em outra parte do sistema.

Não seria bom contar com um botão mágico ao nosso dispor que, após o código-fonte ser alterado, ele pudesse ser pressionado para indicar com uma luz vermelha se houvesse algum problema ou verde se estivesse tudo certo?

Se eu dissesse que esse botão mágico existe, você acreditaria? Pois é, podemos equipará-lo ao TDD (Test Driven Development). Essa analogia foi criada pelo Robert C. Martin, mais conhecido como Uncle Bob.

Uma das maiores vantagens em desenvolver software utilizando essa prática, mesmo em sistemas de baixa complexidade, é que, conforme o sistema vai evoluindo - seja por adição de novas regras, seja por alteração de regras existentes - é que ela dá segurança ao desenvolvedor para realizar livremente alterações e refatorações.

Isso garantirá a sobrevida do sistema, pois novas pessoas poderão ingressar no time e alterar sem medo o código-fonte. Flexibilidade e manutenibilidade: o software estará preparado para mudanças.


As três leis do TDD

A aplicação bem sucedida dessa prática segue 3 regras:

  1. Você não poderá escrever nenhum código de produção a não ser que seja para passar um teste unitário que esteja falhando;

  2. Você não poderá escrever mais em um código de teste unitário do que o suficiente para que ele falhe (e falhas de compilação são falhas), e;

  3. Você não poderá escrever mais em um código de produção do que o suficiente para passar no teste unitário que esteja falhando.

Ou seja, comece escrevendo o teste unitário. A título de exemplo (em C#):

public class PessoaTests
{
    [Fact]
    public void TodaNovaPessoaTem18Anos()
    {
        var pessoa = new Pessoa();
    }
}

Nesse caso, vamos supor que a classe Pessoa não exista. Por óbvio, o código não compilará e será considerado como um teste falho.

Nos concentramos então em escrever o código de produção.

public class Pessoa 
{

}

Como temos um código de produção suficiente para passar no teste unitário, voltamos para o nosso código de teste.

public class PessoaTests
{
    [Fact]
    public void TodaNovaPessoaTem18Anos()
    {
        var pessoa = new Pessoa();
        Assert.True(pessoa.Idade == 18);
    }
}

Repare que o teste irá falhar (a classe Pessoa não possui campo ou propridade Idade), fazendo com que nosso foco retorne para o código de produção. Isso é conhecido como o TDD loop, que faz com que o teste e o código de produção sejam escritos lado a lado.

O loop termina quando o código de produção estiver com a implementação necessária e com o teste unitário passando.


Referências

Martin, Robert C., ed. (2019) Clean Agile: Back to Basics. 1st ed. Pearson.

Martin, Robert C., ed. (2008) Clean Code: A Handbook of Agile Software Craftsmanship. 1st ed. Pearson.

tdd
xp


Thomaz Saito
Thomaz Saito
Desenvolvedor fullstack .Net/Angular/Azure/GitHub