django-setuptest icon indicating copy to clipboard operation
django-setuptest copied to clipboard

Simple test suite enabling Django app testing via $ python setup.py test.

Django Setuptest

Simple module enabling Django app testing via $ python setup.py test.

.. contents:: Contents :depth: 5

Normally when you execute $ python setup.py test for Django related modules you're almost certain to run into DJANGO_SETTINGS_MODULE environment variable issues, e.g.::

ImportError: Settings cannot be imported, because environment variable
DJANGO_SETTINGS_MODULE is undefined.

This module overcomes this by configuring the DJANGO_SETTINGS_MODULE environment variable before executing your test suite. As a bonus it also generates Coverage_ and PEP 8_ reports as part of the test.

Installation

#. Provide a test_suite argument to the setup call specifying the setuptest.setuptest.SetupTestSuite test suite, e.g.::

setup(
    # ...
    test_suite='setuptest.setuptest.SetupTestSuite',
)

Alternatively provide a cmdclass test argument to the setup call specifying the setuptest.test command, e.g.::

from setuptest import test

#...

setup(
    # ...
    cmdclass={'test': test},
)

This overrides Python's builtin test command to enable the Django testrunner as well as allowing you to pass --failfast as a commandline argument, i.e.::

$ python setup.py test --failfast

For the cmdclass method to work django-setuptools should be installed and available in your Python path prior to running the test command, in which case django-setuptest is not required to be specified as part of the tests_required argument as detailed next.

#. Provide a tests_require argument to the setup call including django-setuptest (required only if not already installed) and other package dependencies needed to execute the tests, e.g.::

setup(
    # ...
    tests_require=(
        'django-setuptest',
    ),
)

#. Specify your test specific Django settings in a test_settings module in the same path as your app's setup.py. These settings will be used when executing the tests, e.g. in test_settings.py::

DATABASE_ENGINE = 'sqlite3'

INSTALLED_APPS = (
    'myapp',
)

#. In order for the test suite to find your tests you must provide either a packages or py_modules argument to the setup call, e.g.::

from setuptools import setup, find_packages

setup(
    # ...
    packages=find_packages(),
)

# Or alternatively...

setup(
    # ...
    py_modules=['myapp'],
)

Usage

Once correctly configured you can execute tests from the command line::

$ python setup.py test

or, if you want the test suite to stop after the first test failure is detected::

$ python setup.py test --failfast

This should output your test results as well as Coverage_ and PEP 8_ reports.

.. note::

An XML Coverage report is generated in a file called ``coverage.xml``
and a PEP8 report is generated in a file called ``pep8.txt``

To mute the output of the Coverage_ and PEP 8_ reports provide the --quiet option::

$ python setup.py test --quiet

To automatically restart the test runner when code changes are detected (similar to how runserver restarts) provide the --autoreload option::

$ python setup.py test --autoreload

To only run tests for a particular test case specify the test case as the --label option::

$ python setup.py test --label app.TestCase

Or for a particular test method specify the test case's test method as the --label option::

$ python setup.py test --label app.TestCase.test_method

Sample Output

Example output of dummy test including Coverage_ and PEP 8_ reports::

$ python setup.py test
running test
running egg_info
writing django_dummy.egg-info/PKG-INFO
writing top-level names to django_dummy.egg-info/top_level.txt
writing dependency_links to django_dummy.egg-info/dependency_links.txt
reading manifest file 'django_dummy.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
writing manifest file 'django_dummy.egg-info/SOURCES.txt'
running build_ext
Creating test database for alias 'default'...
E
======================================================================
ERROR: test_something (dummy.tests.TestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/user/tmp/django-dummy/dummy/tests/__init__.py", line 6, in test_something
    raise NotImplementedError('Test not implemented. Bad developer!')
NotImplementedError: Test not implemented. Bad developer!

----------------------------------------------------------------------
Ran 1 test in 0.000s

FAILED (errors=1)
Destroying test database for alias 'default'...

Coverage Report:
Name              Stmts   Miss  Cover   Missing
-----------------------------------------------
dummy/models      20      2    90%   22, 55

PEP8 Report:
dummy/tests/__init__.py:6:1: W391 blank line at end of file

$

.. _Coverage: http://nedbatchelder.com/code/coverage/ .. _PEP 8: http://www.python.org/dev/peps/pep-0008/