Meus testes de unidade do Django levam muito tempo para serem executados, então estou procurando maneiras de acelerar isso. Estou pensando em instalar um SSD , mas sei que também tem suas desvantagens. Claro, há coisas que eu poderia fazer com meu código, mas estou procurando uma correção estrutural. Mesmo a execução de um único teste é lenta, pois o banco de dados precisa ser reconstruído / migrado para o sul toda vez. Então aqui está a minha ideia ...
Como sei que o banco de dados de teste sempre será muito pequeno, por que não consigo simplesmente configurar o sistema para manter sempre o banco de dados de teste inteiro na RAM? Nunca toque no disco. Como eu configuro isso no Django? Eu preferiria continuar usando o MySQL, já que é isso que uso na produção, mas se o SQLite 3 ou algo mais facilita isso, eu continuaria assim.
O SQLite ou o MySQL tem uma opção para executar inteiramente na memória? Deveria ser possível configurar um disco RAM e, em seguida, configurar o banco de dados de teste para armazenar seus dados lá, mas não sei como instruir o Django / MySQL a usar um diretório de dados diferente para um determinado banco de dados, especialmente porque ele continua sendo apagado e recriou cada corrida. (Estou em um Mac FWIW.)
fonte
"test" in sys.argv
; pode ser acionado quando você não deseja, por exemplomanage.py collectstatic -i test
.sys.argv[1] == "test"
é uma condição mais precisa que não deve ter esse problema.Normalmente, crio um arquivo de configurações separado para testes e o uso no comando test, por exemplo
Tem dois benefícios:
Você não precisa procurar
test
ou qualquer palavra mágica em sys.argvtest_settings.py
pode simplesmente serOu você pode ajustá-lo ainda mais para suas necessidades, separando claramente as configurações de teste das configurações de produção.
Outro benefício é que você pode executar o teste com o mecanismo de banco de dados de produção em vez do sqlite3, evitando erros sutis, portanto, ao desenvolver o uso
e antes de confirmar o código, execute uma vez
só para ter certeza de que todos os testes estão realmente passando.
fonte
O MySQL suporta um mecanismo de armazenamento chamado "MEMORY", que você pode configurar em seu banco de dados config (
settings.py
) como:Observe que o mecanismo de armazenamento MEMORY não suporta colunas de blob / texto; portanto, se você estiver usando
django.db.models.TextField
isso, não funcionará para você.fonte
Não consigo responder à sua pergunta principal, mas há algumas coisas que você pode fazer para acelerar as coisas.
Primeiramente, verifique se o seu banco de dados MySQL está configurado para usar o InnoDB. Em seguida, ele pode usar transações para reverter o estado do banco de dados antes de cada teste, o que, na minha experiência, levou a uma aceleração maciça. Você pode passar um comando init do banco de dados em seu settings.py (sintaxe do Django 1.2):
Em segundo lugar, você não precisa executar as migrações sul cada vez. Defina
SOUTH_TESTS_MIGRATE = False
em settings.py e o banco de dados será criado com o syncdb simples, que será muito mais rápido do que executar todas as migrações históricas.fonte
369 tests in 498.704s
para369 tests in 41.334s
. Isso é mais de 10 vezes mais rápido!--keep
para manter o banco de dados e não exigir que seu conjunto completo de migrações seja reaplicado em cada execução de teste. Novas migrações ainda serão executadas. Se você alternar entre ramificações com frequência, é fácil entrar em um estado inconsistente (você pode reverter novas migrações antes de mudar, alterando o banco de dados para o banco de dados de teste e executandomigrate
, mas é um pouco trabalhoso).Você pode fazer ajustes duplos:
Estou usando os dois truques e estou muito feliz.
Como configurá-lo para o MySQL no Ubuntu:
Cuidado, é apenas para teste, após a reinicialização do banco de dados da memória ser perdida!
fonte
Outra abordagem: tenha outra instância do MySQL executando em um tempfs que use um disco RAM. Instruções nesta postagem do blog: Acelerando o MySQL para testes no Django .
Vantagens:
fonte
Estendendo a resposta de Anurag, simplifiquei o processo criando as mesmas test_settings e adicionando o seguinte a manage.py
parece mais limpo, pois o sys já foi importado e o manage.py é usado apenas via linha de comando, portanto, não é necessário desorganizar as configurações
fonte
"test" in sys.argv
; pode ser acionado quando você não deseja, por exemplomanage.py collectstatic -i test
.sys.argv[1] == "test"
é uma condição mais precisa que não deve ter esse problema../manage.py
sem argumentos (por exemplo, para ver as extensões estão disponíveis, mesmo que--help
)len(sys.argv) > 1 and sys.argv[1] == "test"
Use abaixo em seu
setting.py
fonte