Django unidade testando com equipamentos de carregamento para vários problemas dependentes de aplicações
-
22-09-2019 - |
Pergunta
Agora estou fazendo testes unitários para o código já existente. Eu enfrentei o próximo problema:
Depois de executar o SyncDB para criar um banco de dados de teste, o Django preenche automaticamente várias tabelas como Django_Content_Type ou Auth_Permissions.
Em seguida, imagine que eu preciso executar um teste complexo, como verificar o registro dos usuários, que precisará de uma Tabelas e conexões de dados OT OT entre eles.
Se eu tentar usar todo o meu banco de dados existente para fazer acessórios (isso seria bastante condenado para mim) - vou receber o erro como aqui. Isso acontece porque o Django já encheu tabelas como Django_Content_Type.
A próxima maneira possível é usar a opção Django DumpData -Exclude para tabelas SyncDB já preenchidas. Mas isso não funciona bem também, porque se eu levar objetos de usuário e grupo de usuários da tabela de permissões de banco de dados e usuário, que foram criados automaticamente pelo SyncDB, posso receber erros, porque as chaves primárias, conectando -as agora apontando errado. Isso é melhor descrito aqui em parte 'fixing inferno', mas a solução mostrada lá não parece boa)
O próximo esquema possível que vejo é o próximo:
- Estou executando meus testes; O Django cria banco de dados de teste, faz o SyncDB e cria todas essas tabelas.
- Na minha configuração de teste, estou descartando esse banco de dados, criando o novo banco de dados em branco.
- Carregar o despejo de dados do banco de dados existente também na configuração de teste
Solução
É assim que o problema foi resolvido:
Depois que o SyncDB criou o banco de dados de teste, na parte de configuração dos testes que eu uso os.system
Para acessar o shell do meu código. Então, estou apenas carregando o despejo do banco de dados, que quero usar para testes.
Portanto, isso funciona assim: o SyncDB preenche o contentType e algumas outras tabelas com dados. Em seguida, na parte de configuração dos testes que carregam o dump SQL limpa todos os dados criados anteriormente e eu recebo um bom banco de dados.
Pode não ser a melhor solução, mas funciona =)
Outras dicas
Minha abordagem seria primeiro usar o sul para facilitar as migrações do banco de dados (o que não ajuda, mas é bom) e, em seguida, usar um módulo de métodos de criação de modelos.
Quando você corre
$ manage.py test my_proj
Django com South instalado com o Create the Test DB e execute todas as suas migrações para fornecer um banco de dados de teste completamente atualizado.
Para gravar testes, primeiro crie um módulo Python Calle, test_model_factory.py aqui crie funções que criam seus objetos.
def mk_user():
User.objects.create(...)
Em seus testes, você pode importar seu módulo test_model_factory e criar objetos para cada teste.
def test_something(self):
test_user = test_model_factory.mk_user()
self.assert(test_user ...)