Setting up a test runner

Ned Batchelder’s coverage.py is an invaluable tool for any Python project. django_coverage makes coverage.py run inside of Django, and this is my preferred way of using that tool.

Step 1 - environment prep

In your virtualenv install the necessary requirements:

$ pip install -r requirements.txt

Make a coverage directory in your project directory:

# This is done for you in django-party-pack
#   but you'll need to remember it for future projects
$ mkdir coverage

Step 2 - create testrunner.py

Create a testrunner.py file into your project root and paste in the following code:

# Make our own testrunner that by default only tests our own apps

from django.conf import settings
from django.test.simple import DjangoTestSuiteRunner
from django_coverage.coverage_runner import CoverageRunner

class OurTestRunner(DjangoTestSuiteRunner):
    def build_suite(self, test_labels, *args, **kwargs):
        return super(OurTestRunner, self).build_suite(test_labels or settings.PROJECT_APPS, *args, **kwargs)

class OurCoverageRunner(OurTestRunner, CoverageRunner):
    pass

Step 3 - settings customization

The first thing you’ll notice about dpp is that apps installment is broken up into three variables:

  • PREREQ_APPS - These are either built-in Django apps or third-party apps you don’t want to test.
  • PROJECT_APPS - These are the custom apps you’ve written for your project. You want to test these.
  • INSTALLED_APPS - This is what Django loads into it’s app cache. We generate this iterable by adding PREREQ_APPS to PROJECT_APPS.

Here is the sample code from dpp/pollaxe project settings.py file:

PREREQ_APPS = (
     'django.contrib.auth',
     'django.contrib.contenttypes',
     'django.contrib.sessions',
     'django.contrib.sites',
     'django.contrib.messages',
     'django.contrib.admin',
)

PROJECT_APPS = (
    'polls', # or whatever your custom project uses
)

INSTALLED_APPS = PREREQ_APPS + PROJECT_APPS

Also in settings.py, underneath where you have defined the PREREQ_APPS setting, add the following:

TEST_RUNNER = 'testrunner.OurCoverageRunner'
COVERAGE_MODULE_EXCLUDES = [
    'tests$', 'settings$', 'urls$', 'locale$',
    'migrations', 'fixtures', 'admin$',
]
COVERAGE_MODULE_EXCLUDES += PREREQ_APPS
COVERAGE_REPORT_HTML_OUTPUT_DIR = "coverage"

Step 4 - run it!

From the command-line:

$ python manage.py test

Open file:///path-to-your-project/coverage/index.html in a web browser and check out your coverage.