Como organizar e estruturar os testes unitários no Django – Parte I

Teste Unitário Django

Você sabe qual a importância dos testes unitários em um projeto de software? Sabe como organizar seus testes unitários no Django? Bom, se respondeu não a alguma das perguntas anteriores ou se já trabalha com testes e quer melhorar sua performance, continue lendo este post. LEIA ATÉ O FINAL.

Estrutura do projeto

Sobre a estrutura do projeto explico em detalhes como e porque trabalhar com ela no Curso Django Pro, se quiser conhecer mais sobre o curso, clique aqui, atualmente continuo com essa estrutura por considerá-la bastante versátil e de fácil entendimento e consigo montar ela rapidamente.

Estrutura do Projeto Django

Organização dos testes unitários

Bom, o próximo passo e para ser mais objetivo é demonstrar a organização dos testes, perceba na imagem acima que tenho um diretório chamado tests, esse cara não vem com a estrutura padrão do Django, eu criei e vamos dar foco nessa parte do projeto.

Módulo Tests

Ok, depois de ler muita coisa na internet, livros sobre testes e ter testado algumas configurações, cheguei a conclusão que a melhor estrutura de fato, seria esta, em nosso projeto de exemplo, eu simplesmente organizei para unit tests, porém, em projetos maiores sempre temos outros tipos de testes, como por exemplo os testes funcionais e testes de integrações, se esse for o seu caso, sugiro dentro do módulo tests criar mais dois diretórios, um para cada tipo de teste e assim, os módulos .py de cada tipo de teste ficaria em seu respectivo diretório, sacou?

Outra coisa importante a ser observada é, para que o diretório tests seja reconhecido como um módulo Python, é preciso criar um arquivo __init__.py vazio dentro do mesmo, para o Django, de um tempo pra cá, isso não importa, basta que os módulos .py inicie com tests_, ele já detectará que se trata se uma suíte de testes e executará todos.

Continuando, você pode testar absolutamente qualquer coisa no seu projeto, porém, use o bom senso para decidir o que de fato precisa ser testado! Tenha em mente que, se tiver a chance daquele código quebrar, então ele merece ser testado. Geralmente, eu sigo testando os modelos, formulários e views, por isso na imagem acima você vê que tenho três módulos .py, uma para cada recurso, todos os testes que serão feitos nos modelos daquela aplicação, estarão no módulo tests_models.py, e assim, sucessivamente, os das views e dos formulários.

O que testar no meu código?

Essa é uma pergunta recorrente, recebo com frequência e, toda vez respondo com a pergunta… Qual o comportamento esperado para o seu código? Bingo! Então é isso que você deve, pelo menos inicialmente, testar! Teste o comportamento esperado, se o método foo() deve retornar a string “bar”, então é isso que você deve assegurar que o método está fazendo, certo? Sacou a parada?

Exemplo Teste Modelo

Como deve ser os testes no Django?

Basicamente, os testes se resumem a uma classe que herda de TestCase e sobrescreve alguns métodos, caso necessário e que contenha de fato, nos métodos os testes a serem executados. No exemplo da imagem acima, temos dois métodos, o setUp(self) e o test_retorno_str(self), vou explicar melhor sobre eles.

O método setUp(self) você usará ele se tiver a necessidade de fazer uma “configuração” antes da execução dos testes, isso significa que, esse carinha, sempre será executado antes de qualquer teste, então se você quer garantir que algo seja feito antes do teste rodar, terá que sobrescrever esse cara e dentro fazer suas preparações, no exemplo, estou simples criando uma instância de Pessoa().

O segundo método do exemplo é o test_retorno_str(self), como dar pra perceber, é nele que fazemos os testes que irão averiguar e garantir o comportamento desejado do código em questão. É importante ter em mente que a palavra test_ que antecede o nome do método, é obrigatória, é através dela que a suíte de testes do Python e Django o reconhecerão.

E nos testes, existem as assertions, que são os métodos que irão verificar o retorno do código, você pode testar diversas situações, existem diversos métodos desses. Dar uma olhada aqui para conferir alguns deles.

Para rodar os testes criado, você deve ir no terminal e executar o comando ./manage.py test, isso vai rodar todos os testes do seu projeto, indicado principalmente quando se tem a intenção de rodar testes de integrações, mas pra ser mais rápido, execute o mesmo comando mas com o nome da app Django especificado no final, por exemplo: ./manage.py test core.

Por que devo me importar com testes unitários?

Porque você como programador e “pai da criança”, tem a responsabilidade de garantir que o seu código funciona! Simples assim. Ninguém melhor que você para criar os testes dos seus códigos, afinal, você tem a lógica na sua cabeça, você é o autor, você o criou.

Creio que não há justificativa melhor que essa, se tiver mais alguma em mente, colabore, deixe aí nos comentários. 😎

Quando devo começar a testar meus códigos?

A qualquer momento! O ideal é que os testes sejam concomitante com o código, mas a melhor hora para começar a testar seu software, é agora. Se você já tem um projeto em andamento ou mesmo em produção e não tem nada de testes unitários, comece criando testes para as próximas funcionalidades, com o tempo, vá criando testes para as funcionalidades já existentes, aproveita e faça aquela refatoração que já está pendente há algum tempo. 🙂

Conclusão

O universo Testes de Softwares é muito vasto, existem diversos trabalhos em cima disso, cursos de mestrado e doutorado sobre o assunto, em hipótese alguma eu tive a intenção de esgotar esse assunto com este post, a minha intenção na verdade foi simplesmente abrir sua mente para essa possibilidade e boa prática que garante um pouco mais de qualidade aos seus software.

No mais, espero ter acrescentado algo mais na sua caixinha de ferramentas, desde já agradeço a sua companhia e te desejo sucesso na sua jornada como programador. Ahhhhh, não esqueça, adicione mais tempero a essa conversa, comente, compartilhe nas suas redes sociais, mostre que você é um cara que sempre busca melhorias, além de ajudar outras pessoas!

E o que vem depois? Continue aprendendo! Assista a vídeos sobre o assunto, leia posts, ebooks e livros, de diversas fontes, veja outras opiniões a respeito do mesmo assunto, isso ajudará e muito seu aprendizado.

Aproveite e mantenha-se conectado comigo, siga meu perfil no Instagram e inscreva-se no Canal do YouTube. XD

Leitura recomendada

Vou deixar alguns links que a leitura deles com certeza farão a diferença.

Seria uma covardia minha não indicar a documentação né papai, afinal de contas, tudo que você precisar sobre o Framework Django, certamente você encontrará nela.

https://docs.djangoproject.com/en/3.0/topics/testing/overview/
https://docs.djangoproject.com/en/3.0/topics/testing/tools/
https://docs.djangoproject.com/en/3.0/topics/testing/advanced/

Alguns materiais de terceiros também ajuda!

https://test-driven-django-development.readthedocs.io/en/latest/
https://realpython.com/testing-in-django-part-1-best-practices-and-examples/
https://www.obeythetestinggoat.com/book/praise.harry.html

Link do código fonte gerado

https://gitlab.com/djangopro/djangounittests

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *