Testes automatizados com Pytest — Parte II

Nicole Barros
3 min readDec 26, 2022

--

No artigo anterior vimos sobre como testar nossos modelos. Agora veremos sobre como podemos testar nossos serializers. Mas o que são serializers? Os serializadores traduzem os dados do modelo de e para JSON.

Nos testes, devemos verificar se os dados enviados para o Serializer segue o padrão que o modelo define como ideal. Nossos testes devem ser capazes de cobrir casos em que os dados sejam válidos e detectar de erros.

Vamos começar?

Testando dados válidos

movie/tests/test_serializers.py

import pytest

from movie.serializers import MovieSerializer
from datetime import datetime
from rest_framework.utils import json
from rest_framework.utils.encoders import JSONEncoder


def test_valid_movie_serializer():
valid_serializer_data = {
"title": "Homem-Aranha: Sem Volta para Casa",
"genre": "Ação/Aventura",
"year": "2021",
"creation_date": '2022-02-14T00:00:00-03:00'
}

serializer = MovieSerializer(data=valid_serializer_data)
assert serializer.is_valid()
assert json.loads(json.dumps(serializer.validated_data, cls=JSONEncoder)) == valid_serializer_data
assert serializer.data == valid_serializer_data
assert serializer.errors == {}

Aqui criamos uma função de teste onde construimos um json com valores esperados, estes serão passados para a instância de nosso MovieSerializer, para que através do assert, verificarmos se de fato são válidos e se há ausência de erros.

Testando dados válidos

movie/tests/test_serializers.py

from rest_framework.exceptions import ErrorDetail

def test_invalid_movie_serializer():
invalid_serializer_data = {
"title": "Homem-Aranha: Sem Volta para Casa",
"genre": "Ação/Aventura",
}

serializer = MovieSerializer(data=invalid_serializer_data)
assert not serializer.is_valid()
assert serializer.validated_data == {}
assert serializer.data == invalid_serializer_data
assert serializer.errors == {"year": [ErrorDetail(string='Este campo é obrigatório.', code='required')]}

Propositalmente, no json deixamos de passar uma propriedade importante de nosso objeto para validar a existência de erro. Nesse caso retiramos o campo year e esperamos que o teste passe, já que uma detecção de erro foi coberta por ele.

Execute os testes com:

pytest movie/tests 

Devemos esperar um ImportError, já que não criamos o nosso Serializer ainda:

Construção do serializer Movie

movie/serializers.py

from rest_framework import serializers
from .models import Movie


class MovieSerializer(serializers.ModelSerializer):
class Meta:
model = Movie
fields = '__all__'
read_only_fields = ('id', 'created_date', 'updated_date',)

Aqui, criamos uma nova classe chamada MovieSerializer de um ModelSerializer que gera todos os campos do modelo.

Ao identificar determinados campos como “somente leitura“, podemos garantir que eles nunca serão criados ou atualizados por meio do serializador.

Execute novamente os testes e certifique-se de que todos passem.

Até aqui vimos aqui como testar os nossos serializers, escrevemos testes tanto para dados válidos como para inválidos e escrevemos verificações assertivas.

Espero que tenha gostado! No próximo artigo veremos como testar propriedades com o tipo DateTimeField. Até lá.

--

--