Testes automatizados com Pytest — Parte I

Nicole Barros
3 min readDec 15, 2022

--

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.

--

--