Problemas com QuerySet em teste unitário

13 views
Skip to first unread message

Adriano Campos

unread,
Apr 7, 2021, 1:08:46 AMApr 7
to Django Brasil
Olá, estou apanhando com uma questão.

Estou realizando dentro de um teste unitário com TestCase a seguinte query:

query = BasicTarefa.objects.all().exclude(_marco_inicial__isnull=True).first()

O retorno é vazio, no entanto, o banco de dados está populado e com instâncias que satisfazem a query. Tanto é que executo o mesmo código no shell e obtenho o resultado adequado com uma instância do mesmo model.

A classe BasicTarefa está sendo corretamente importada e, inclusive, na classe de testes existem outros testes com o mesmo model que não apresentam problema, mas, nenhum deles gera uma query e apenas acessam um classmethod.

Eu não posso executar querys em testes unitários?
É preciso alguma outra configuração para que a query seja executada adequadamente no test?

Desde já obrigado pela colaboração.

Rafael Henter

unread,
Apr 7, 2021, 7:54:40 AMApr 7
to django...@googlegroups.com
Bom dia Adriano,

Claro que você pode realizar queries mas você precisa de alguma configuração para que o teste haja como se o banco esteja limpo ou que um teste não tenha influência em outro. Se tiver usando o pytest isso é meio que automático, mas se for via classe de TestUnit você vai precisar configurar p setup do seu test para realizar a limpeza para vc para garantir que você não tenha “ruído” em seus testes.

Abs,

Rafael Henter


Em 7 de abr. de 2021, à(s) 02:08, Adriano Campos <drindrin....@gmail.com> escreveu:

Olá, estou apanhando com uma questão.
--
Você recebeu essa mensagem porque está inscrito no grupo "Django Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para django-brasi...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/django-brasil/ec55af86-813b-47ac-982b-ae258a0877e7n%40googlegroups.com.

Adriano Campos

unread,
Apr 7, 2021, 10:55:02 AMApr 7
to Django Brasil
Henter,
Inicialmente agradeço a sua atenção e presteza.
Bom, na verdade, eu voltei a ler a documentação (sou novo em Django) e entendi melhor que no TestCase, ele faz um clone do BD mas, sem os dados.
Ou seja, não há nada de errado no comportamento já que a queryset não pode retornar nada mesmo.
Agora, a minha questão é como clonar senão todo, mas, pelo menos parte dos dados do meu banco de dados por que o teste que eu pretendo fazer só tem sentido (só se torna válido) com o tempo, se eu poder colher um registro do BD (real, em desenvolvimento ou mesmo produção) para testar.
Eu encontrei um artigo muito interessante (não trata necessariamente deste assunto), mas, onde o autor, em determinado momento, explica as etapas no momento de execução do teste (https://medium.com/@gilsondev/criando-testes-de-unmanaged-models-no-django-29f2becdf22f): 
  • Criar tabelas no banco de testes usando as migrations (default em SQLite: test_nome_do_banco.sqlite)
  • Prepara o suite de testes
  • Faz o uso do método setUp
  • Executa os testes automatizados
  • Se for usado os modelos para criar dados fake, insere na tabela recém criada
  • Faz o uso do método tearDown
  • Remove os registros criados nos testes
  • Elimina o suite de testes
  • Remove as tabelas do banco de dados de teste
Bom, achei muito interessante, mas, por essa sequência, os dados só seriam inseridos depois de executados os testes automatizados.
É isso mesmo? Porque isso não me parece fazer sentido.
Reply all
Reply to author
Forward
0 new messages