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