Testando Apps plugáveis do Django

por Fábio Cerqueira | 09 set, 2012 | Tags: django testes

Testes de projetos completos com Django é facilmente encontrada documentação sobre o assunto na página oficial do projeto, mas algumas vezes é necessário testar apenas uma aplicação plugável sem ter um projeto completo.

Recemente eu precisei integrar os testes da aplicação do django-pagseguro com Travis CI, nas minhas buscas encontrei um excelente post do Ben Welsh sobre o assunto. O código abaixo é como ficou meu script de run_tests.py que o Travis CI irá executar.

#!/usr/bin/env python
#-*- coding: utf-8 -*-
import os
import sys
from django.conf import settings

class QuickDjangoTest(object):
    """
    A quick way to run the Django test suite without a fully-configured project.

    Example usage:

        >>> QuickDjangoTest('app1', 'app2')

    Based on a script published by Lukasz Dziedzia at:
    http://stackoverflow.com/questions/3841725/how-to-launch-tests-for-django-reusable-app
    """
    DIRNAME = os.path.dirname(__file__)
    INSTALLED_APPS = (
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.admin',
    )

    def __init__(self, *args, **kwargs):
        self.apps = args
        # Get the version of the test suite
        self.version = self.get_test_version()
        # Call the appropriate one
        if self.version == 'new':
            self._new_tests()
        else:
            self._old_tests()

    def get_test_version(self):
        """
        Figure out which version of Django's test suite we have to play with.
        """
        from django import VERSION
        if VERSION[0] == 1 and VERSION[1] >= 2:
            return 'new'
        else:
            return 'old'

    def _old_tests(self):
        """
        Fire up the Django test suite from before version 1.2
        """
        settings.configure(DEBUG = True,
            DATABASE_ENGINE = 'sqlite3',
            DATABASE_NAME = os.path.join(self.DIRNAME, 'database.db'),
            INSTALLED_APPS = self.INSTALLED_APPS + self.apps,
            PAGSEGURO_ERRO_LOG = 'pagseguro_erro.log',
            PAGSEGURO_TOKEN = '123456',
            PAGSEGURO_URL_RETORNO = '/pagseguro/retorno/',
            PAGSEGURO_URL_FINAL = '/obrigado',
            PAGSEGURO_EMAIL_COBRANCA = 'seu@email.com',
            ROOT_URLCONF = 'django_pagseguro.urls'
        )
        from django.test.simple import run_tests
        failures = run_tests(self.apps, verbosity=1)
        if failures:
            sys.exit(failures)

    def _new_tests(self):
        """
        Fire up the Django test suite developed for version 1.2
        """
        settings.configure(
            DEBUG = True,
            DATABASES = {
                'default': {
                    'ENGINE': 'django.db.backends.sqlite3',
                    'NAME': os.path.join(self.DIRNAME, 'database.db'),
                    'USER': '',
                    'PASSWORD': '',
                    'HOST': '',
                    'PORT': '',
                }
            },
            INSTALLED_APPS = self.INSTALLED_APPS + self.apps,
            PAGSEGURO_ERRO_LOG = 'pagseguro_erro.log',
            PAGSEGURO_TOKEN = '123456',
            PAGSEGURO_URL_RETORNO = '/pagseguro/retorno/',
            PAGSEGURO_URL_FINAL = '/obrigado',
            PAGSEGURO_EMAIL_COBRANCA = 'seu@email.com',
            ROOT_URLCONF = 'django_pagseguro.urls'
        )
        from django.test.simple import DjangoTestSuiteRunner
        failures = DjangoTestSuiteRunner().run_tests(self.apps, verbosity=1)
        if failures:
            sys.exit(failures)

if __name__ == '__main__':
    QuickDjangoTest('django_pagseguro')

O detalhe para executar corretamente os testes está em configurar o settings apenas com o necessário através do configure e executar o Runner com o run_tests. O uso do sys.exit(failures) se faz necessário para que outros programas(no caso o Travis CI) consiga identificar se os testes falharam ou não.

Este exemplo o código foi feito para executar sobre as versões antigas e novas do Django, caso seu projeto seja válido apenas do Django 1.2 ou superior use apenas o método _new_tests.

blog comments powered by Disqus