◈Metanoia Lab← Backend
Pytest + Django

Capítulo 3 — O parâmetro db em fixtures e testes

Uma alternativa ao @pytest.mark.django_db

Além da marcação django_db, temos uma outra forma de conseguirmos fazer testes no banco de dados: através do parâmetro db dentro de uma fixture.

Usando db numa fixture

Quando, através de uma fixture, nós recebemos por parâmetro o db (ele não é importado, o próprio pytest desenrola pra gente), e retornamos um usuário criado, quando inserimos a nossa fixture dentro do nosso teste podemos alterar a senha desse usuário e em seguida verificar se a senha foi corretamente trocada. Observe que o teste não precisa declarar @pytest.mark.django_db, isso porque ele recebe como parâmetro a fixture que já tem o db como parâmetro — então quaisquer testes que usem essa fixture com db não precisarão usar o decorator.

@pytest.fixture()
def user_1(db):
return User.objects.create_user('test-user')
def test_set_check_password(user_1):
user_1.set_password('new-password')
assert user_1.check_password('new-password') is True
✦

Usando db diretamente numa função de teste

Outro detalhe é que podemos colocar um db como parâmetro em qualquer função de teste, e não somente em fixtures, dessa forma, por exemplo:

def test_set_check_password(db):
user_1 = User.objects.create_user('test-user')
user_1.set_password('new-password')
assert user_1.check_password('new-password') is True
✦

Cuidado com scope session

Aqui vale uma última consideração: não se deve tentar utilizar scope session em uma fixture que tenha db, isso porque o pytest-django, ao utilizar a fixture universal db, já a prende como function. Caso tentemos colocar scope session, ele retorna o seguinte:

ScopeMismatch: You tried to access the function scoped fixture db with a session scoped request object. Requesting fixture stack:
tests/test_django_db.py:18: def user_1(db)
Requested fixture:
../.venv/lib/python3.14/site-packages/pytest_django/fixtures.py:379: def db(_django_db_helper: 'None') -> 'None'

Conclusão

Então utilizamos apenas o padrão, que é function mesmo.

@pytest.fixture()
def user_1(db):
return User.objects.create_user('test-user')