Django Migrations vs Unit Tests

A partir da versão 1.7, o Django conta com um sistema de migrations próprio. Com elas é possível controlar as versões do seu banco de dados, podendo voltar para qualquer versão do Schema que for necessário.

Um sistema como estes significa, também, mais trabalho para o Django fazer. Em um ambiente de produção, não há diferenças perceptíveis — As migrations foram feitas para serem executadas em momentos pontuais — Porém, dependendo da sua configuração, é necessário criar o banco de dados no início da execução e destruir ao final dos testes unitários. Se este é o seu caso, é bem possível que você esteja vendo seus testes ficarem mais lentos à medida que novas migrations são criadas.

Desativando as migrations

Ao que parece, este problema é bem comum. Tanto que há algumas soluções.  Sendo que a mais simples consiste em adicionar o seguinte ao seu arquivo settings.py:

class DisableMigrations(object):
    def __contains__(self, item):
        return True

    def __getitem__(self, item):
        return "notmigrations"

MIGRATION_MODULES = DisableMigrations()

Pode até ficar mais simples que isso, pois esta solução já foi integrada como plugin tanto para o manage.py test quanto para o py.test.

Se você migrou recentemente para o Django 1.7, é bem provável que isto acelere seu desenvolvimento. Os meus testes unitários que demoravam em média 120 segundos, parassaram a demorar apenas 10!

Anúncios

Estudo sob demanda

No momento estou lendo o livro The Art of Agile Development. Não estava na lista, mas está sendo muito esclarecedor para mim. O problema é que, ler um livro deste tipo, quebra um pouco minha rotina de estudo (reservo algumas horas na semana para praticar aquilo que estou lendo). Para resolver isto, estou começando a estudar de uma forma um pouco diferente.

Quando estudo tomando por base um livro, geralmente, leio bastante antes de colocar a mão na massa. A formula que estou usando é exatamente o contrário disto, ou seja, leio menos possível sobre o que estou tentando aprender. Algumas vezes, não leio nada.

Comecei a tentar este método com o Django. A parte interessante já começa aí: Nem sei Python direito! Logo de cara, eu tinha que descobrir como instalar. Isto não foi difícil, resolvi com o gerenciador de pacotes.

Com o Django instalado, fui ler um pouco como ele funciona. Como o objetivo é ler menos, comecei pelo tutorial do site do projeto. Assim que fui lendo o tutorial, já fui criando um aplicativo com uma função bem simples. Não fiz o mesmo aplicativo que estava no tutorial, porque queria encontrar problemas diferentes dos resolvidos ali. Aproveitei também para usar o banco de dados sqlite, ao invés do mysql que eu já estou acostumado. Mais uma vez, instalei o sqlite e comecei a usar sem ler a documentação ou ir ao site do projeto (a princípio).

Enquanto fui criando algumas coisas com o Django e o sqlite, foram surgindo algumas perguntas. À medida que isto foi acontecendo, fui lendo a documentação ou fazendo pesquisas. Fui aprendendo sem seguir algum caminho predefinido, somente a minha curiosidade.

Aprender coisas novas desta forma, é muito divertido (nunca tem a parte chata). Porém, isto também pode ser um tanto quanto frustrante. Em alguns momentos, eu não fazia idéia do que estava faltando para o meu aplicativo funcionar. Algumas vezes isto foi resolvido lendo um pouco mais sobre o que estava fazendo, outras vezes simplesmente comecei tudo de novo.

Tenho consciência que ainda vou precisar ler um livro (ou a documentação) das coisas que estou praticando, para aprender de verdade. Mas estudar desta forma, já está me ajudando a conhecer conceitos novos e aplicá-los em coisas que eu uso no dia-a-dia. Além do mais, é uma uma boa forma de começar a ter contato com o “eco-sistema” dos projetos.