quarta-feira, 28 de dezembro de 2011

Acelerando os testes no Django

Finalmente achei algo pra escrever sobre programação. Não vai ser um post longo mas é relativamente útil.


Rápido como o Flash!

Em um projeto que estou trabalhando atualmente, rodamos testes pra garantir que tudo roda como deveria (exceto quando você escreve o teste errado, mas ai é outros quinhentos), e tinhamos o problema de que o teste levava 3 minutos e 35 segundos pra rodar


Aham, sei, 0.2 segundos pra rodar o teste ¬¬

Como da pra imaginar, mais de 90% do tempo era gasto criando tabelas, importando fixtures e criando índices (nessa ordem).

O problema de ter testes demorando tanto pra executar é que você fica de saco cheio de ter que esperar o teste rodar pra saber se tudo funcionou certinho e continuar programando, especialmente porque em essência o TDD deve ser escrito antes do código: Você escreve o teste, naturalmente ele não passa, e você escreve a "correção" para o teste.

Ter que fazer isso com uma lag de 3 minutos entre os comandos é um saco ainda mais se o Google Reader já estiver zerado. Então eu dei um jeito de fazer o teste rodar mais rápido.

Edite o seu arquivo settings.py e adicione o seguinte:

if 'na_memoria' in os.environ:
    print '**********************************'
    print 'Vish, rodando as parada na memoria'
    print '**********************************'
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': None
        }
    }

Quando for rodar seus testes execute assim:

$ na_memoria=1 python manage.py test

Isso fará com que todo o banco de dados de teste seja criado na memória, dando uma acelerada bem grande nos testes. Aqui o tempo de execução caiu de 3 minutos pra 11 segundos (10 segundos importando fixture).

Claro que essa solução funciona apenas se seu código for independente de banco de dados (nada -ou quase nada- de SQL na mão).

Nenhum comentário:

Postar um comentário