Como faço para testar um esquema de banco de Django?

votos
6

Eu quero escrever testes que podem mostrar se ou não o banco de dados está em sincronia com o meu arquivo models.py. Na verdade, eu já escrevi-los, apenas para descobrir que o Django cria um novo banco de dados cada vez que os testes são executados com base no arquivo models.py. Existe alguma maneira eu posso fazer o teste models.py utilizar o esquema de banco de dados existente? O que está em mysql / postgresql, e não aquele que está em /myapp/models.py?

Eu não me importo sobre os dados que estão no banco de dados, eu só se preocupam é o esquema ou seja, eu quero que meus testes para perceber se uma tabela no banco de dados tem menos campos do que o esquema no meu arquivo models.py.

Eu estou usando o framework unittest (na verdade a extensão django a ele) se isso tem alguma relevância.

obrigado

Publicado 26/09/2008 em 12:23
fonte usuário
Em outras línguas...                            


1 respostas

votos
9

O que fizemos foi substituir o TEST_RUNNER padrão para que ele não iria criar um novo banco de dados para testar contra. Desta forma, corre-se o teste contra tudo o que a nossa atual base de dados local se parece. Mas tenha muito cuidado se você usar este método porque quaisquer alterações aos dados que você faz em seus testes será permanente. Tenho a certeza que todos os nossos testes restaura quaisquer alterações de volta ao seu estado original, e manter a nossa versão primitiva de nosso banco de dados no servidor e backup.

Então, para fazer isso você precisa copiar o método run_test de django.test.simple para um local no seu projeto - Eu coloquei o meu em myproject / test / test_runner.py

Em seguida, fazer as seguintes alterações para esse método:

// change
old_name = settings.DATABASE_NAME
from django.db import connection
connection.creation.create_test_db(verbosity, autoclobber=not interactive)
result = unittest.TextTestRunner(verbosity=verbosity).run(suite)
connection.creation.destroy_test_db(old_name, verbosity)

// to:
result = unittest.TextTestRunner(verbosity=verbosity).run(suite)

Certifique-se de fazer todas as importações necessárias na parte superior e, em seguida, em suas configurações de arquivo de definir a configuração:

TEST_RUNNER = 'myproject.test.test_runner.run_tests'

Agora, quando você executar ./manage.py teste Django irá executar os testes contra o estado atual de seu banco de dados em vez de criar uma nova versão com base em suas definições de modelo atuais.

Outra coisa que você pode fazer é criar uma cópia de seu banco de dados localmente, e depois fazer uma verificação em seu método novo run_test () como este:

if settings.DATABASE_NAME != 'my_test_db': 
    sys.exit("You cannot run tests using the %s database. Please switch DATABASE_NAME to my_test_db in settings.py" % settings.DATABASE_NAME) 

Dessa forma, não há perigo de executar testes contra seu banco de dados principal.

Respondeu 26/09/2008 em 13:32
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more