Testes automatizados com Pytest — Parte I
Muito se fala a bastante tempo que testes automatizados são indispensáveis no desenvolvimento de software, mas na realidade, são poucos os programadores que o fazem e empresas que exergam a importância de o incluirem no pipeline de entrega.
Essa série de artigos mostrará como podemos implementar testes automatizados com pytest. Não focarei na construção do nosso projeto, nem no nosso modelo. O que teremos aqui é um projeto Django, onde será testado o objeto Movie. Suas propriedades estarão claras nos testes.
Vamos começar!
Instalação
Podemos começar adicionando pytest e pytest-django ao projeto.
pip install pytest
pip install pytest-django
E aqui está nossas depêndecias:
- Django==4.0
- djangorestframework==3.13.1
- psycopg2-binary==2.9.2
- pytest-django==4.5.2
- pytest==6.2.5
Configuração
Criaremos o arquivo pytest.ini à raiz do nosso projeto e definimos nele a variável de ambiente DJANGO_SETTINGS_MODULE para apontar para o arquivo de configurações do Django e as regras de descoberta de teste padrão.
pytest.ini
[pytest]
DJANGO_SETTINGS_MODULE = app.settings
python_files = tests.py test_*.py *_tests.py
Estrutura
Por padrão, o pytest descobrirá automaticamente os arquivos de teste que começam ou terminam com test — por exemplo, test_*.pyou *_test.py.
As funções de teste devem começar com test_, e se você quiser usar classes, elas também devem começar com Test.
Por isso geralmente organizo os testes em um diretório, chamado Tests e este possui a estrutura representada a cima
Conftest será apresentado posteriormente.
Teste Driven Development
Você sabe o que o TDD significa? É um conceito de verificação e validação de um código. No desenvolvimento primeiro criamos um teste, depois o executamos e verificamos a falha e só então desenvolvemos parte da nossa aplicação que faça com que os testes passem. Repita o ciclo.
Vamos ver na prática?
Test
Criaremos um arquivo de teste para o modelo.
test_models.py
import pytest
from movie.models import Movie
@pytest.mark.django_db
def test_movie_model():
movie = Movie(title="Homem-Aranha: Sem Volta para Casa", genre="Ação/Aventura", year="2021")
movie.save()
assert movie.title == "Homem-Aranha: Sem Volta para Casa"
assert movie.genre == "Ação/Aventura"
assert movie.year == "2021"
assert movie.created_date
assert movie.update_date
assert str(movie) == movie.title
No código a cima criamos um teste para um modelo que represente o conceito de um filme. Usamos o decorador @pytest.mark.django_db, para solicitar explicitamente o acesso ao banco de dados.
Driven
Execute o arquivo de teste no terminal e certifique que falhem
pytest movie/tests
Development
models.py
from django.db import models
class Movie(models.Model):
title = models.CharField(max_length=255)
genre = models.CharField(max_length=255)
year = models.CharField(max_length=4)
creation_date = models.DateTimeField(auto_now_add=True)
update_date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"{self.title}"
Execute novamente os testes via terminal e garanta que os testes passem.
Até aqui foi mostrado como iniciar com pytest, configurá-lo e executamos o primeiro teste da estrutura de nossa app: os models. Posteriormente mostrarei, como testar nossos serializers e views.