TDD serve como documentação
Autor: Vinicius Assef | Publicado: 2016-12-12T10:38:00-02:00



No artigo [Por que TDD?](/2016/10/por-que-tdd.html) eu escrevi sobre alguns benefícios de usar TDD, mas foi um texto bem conceitual, sem exemplos. Nesse aqui eu quero mostrar um dos benefícios de testes automatizados na prática: servir como documentação técnica funcional.

Leia com atenção o trecho de código abaixo:

    um_mes_atras = datetime.date.today() - timedelta(days=30)
    URL = (
        "/ferias/cancelar_ferias_nao_aprovadas_marcadas_antes_de?data=%s" % 
        um_mes_atras.strftime("%Y%m%d")
    )

    class TestClientCancelarMarcacaoDeFeriasNaoAprovadas(django.test.TestCase):
        def test_url_get_retorna_http200_qdo_ha_ferias_antigas_nao_aprovadas(self):
            p = apoio.criar_profissional()
            apoio.criar_ferias(
                profissional=p,
                marcado_em=datetime.date.today() - timedelta(days=60),
                aprovado=False
            )
            response = self.client.get(URL)
            self.assertEqual(200, response.status_code)
    
        def test_url_get_retorna_http404_qdo_so_ha_ferias_recentes(self):
            p = apoio.criar_profissional()
            apoio.criar_ferias(
                profissional=p,
                marcado_em=datetime.date.today() - timedelta(days=10),
                aprovado=False
            )
            response = self.client.get(URL)
            self.assertEqual(404, response.status_code)
    
        def test_url_get_retorna_http404_qdo_so_ha_ferias_aprovadas(self):
            p = apoio.criar_profissional()
            apoio.criar_ferias(
                profissional=p,
                marcado_em=datetime.date.today() - timedelta(days=90),
                aprovado=True
            )
            response = self.client.get(URL)
            self.assertEqual(404, response.status_code)


Certamente esse código poderia -- e deveria! -- ser melhorado para rodar em um sistema real. Ele está bem resumido aqui apenas para servir de exemplo.

Se você já programou para web e leu o código acima com atenção terá mais facilidade para entender o que ele faz. Vamos ver o que conseguimos descobrir sobre a URL `/ferias/cancelar_ferias_nao_aprovadas_marcadas_antes_de` sem olhar o código fonte dela.

Pelo nome da classe e pelo conteúdo da variável `URL` conseguimos perceber que estamos testando uma funcionalidade que cancela férias ainda não aprovadas e que foram marcadas antes de determinada data. Descobrimos que precisamos passar `data` como argumento da URL.

Na classe de teste exercitamos dois comportamentos básicos:

1. Se a funcionalidade retorna status HTTP 200 quando existirem marcações de férias antigas e não aprovadas.
1. Se a funcionalidade retorna status HTTP 404 quando não existirem marcações de férias antigas e não aprovadas.

Os testes deixam claro que as férias não podem existir sem um profissional.

Conseguimos inferir que "férias antigas" são todas as que foram marcadas antes de `data`, que é um argumento passado na URL.

Traduzindo para Português:

1. Se existirem férias marcadas antes de `data` e que não foram aprovadas, a funcionalidade deve retornar status HTTP 200.
1. Caso contrário, deve retornar status HTTP 404.

Nesse exemplo simples percebemos que testes automáticos servem para certificar que seus programas funcionam da forma esperada e também ajudam a entender o que o sistema faz. Essa é a utilidade das documentações.

Testes automáticos (principalmente _test first_) precisam ajudar a deixar o código mais claro e mais simples. Se você também usar nomes significativos para variáveis, classes e métodos de teste, logo perceberá como fica mais fácil entender o sistema, mesmo sem olhar a lógica interna das rotinas. Isso ajuda bastante a quem for mexer no sistema. Lembre-se que esse alguém pode ser você, daqui a alguns meses ou alguns anos.

Finalizando, escreva testes automáticos, use nomes significativos neles e tenha um tipo de documentação técnica que ajuda a checar o funcionamento do sistema.



------------------------------------

Agradecimentos: quero agradecer a [Jessica Temporal](http://twitter.com/jtemporal), ao [Eduardo Klosowski](https://eduardoklosowski.wordpress.com/) e ao [Diego Sorrilha](http://twitter.com/diegosorrilha) pelo tempo dedicado revisando e melhorando o texto.


Existem [outros textos sobre testes](/search/label/tests) aqui no blog. Aproveite para lê-los.