skip to navigation
skip to content

django-attest 0.5.3

Provides Django specific testing helpers to Attest

Latest Version: 0.10.0


Provides the same testing helper functionality as Django’s django.test.TestCase wrapper of unittest.TestCase.

django_attest.TestContext provides the most of the same functionality as subclassing django.test.TestCase, and django_attest.TransactionTestContext does the same as django.test.TransactionTestCase.

Both contexts provide a django.test.TestClient object (normally accessed via self.client in django.test.TestCase tests), which can be used to make requests to views for testing.


Use pip:

pip install django-attest


Create a test collection and optionally include one of django-attest’s test contexts. The result is that a client argument is passed to each test within the collection. client is a django.test.TestClient object and allows you to make HTTP requests to your project.

from attest import Tests
from django_attest import TestContext

tests = Tests()

def can_add(client):
    client.get('/some-url/')  # same as self.client.get() if you were using
                              # the standard django.test.TestCase approach

See the TestCase.client documentation for more details.

When using a django.test.TestCase subclass, you’re able to specify various options that affect the environment in which your tests are executed. django-attest provides the same functionality via keyword arguments to the TestContext. The following keyword arguments are supported:

For example if you want to specify fixtures, urls, a client_class, or multi_db, simply pass in these options when creating the django_tables.TestContext object:

from attest import Tests
from django_attest import TestContext

tests = Tests()
tests.context(TestContext(fixtures=['testdata.json'], urls='myapp.urls'))

Transaction management in tests

If you need to test transaction management within your tests, use TransactionTestContext rather than TestContext, e.g.:

from attest import Tests
from django_attest import TransactionTestContext

tests = Tests()

def some_test(client):
    # test something

Testing a reusable Django app

A flexible approach is to create a tests Django project. This shouldn’t be the fully-fledged output of startproject, but instead the minimum required to keep Django happy.


from attest import assert_hook, Tests
import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'tests.settings'
from django_attest import auto_loader

loader = autor_loader.test_loader
suite = Tests()

def example():
    assert len("abc") == 3

Django’s built-in test runner performs various environment initialisation and cleanup tasks. It’s important that tests are run using one of the loaders from django-attest.


    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': ':memory:',


SECRET_KEY = 'abcdefghiljklmnopqrstuvwxyz'

ROOT_URLCONF = 'tests.urls'


from django.conf.urls import patterns
urlpatterns = patterns('')

from setuptools import setup
    tests_require=['Django >=1.1', 'Attest >=0.4', 'django-attest'],

Running the tests

python test

Testing non-reusable apps in a Django project

To test non-reusable apps in a Django project, the app must contain either a tests or models module with either a suite function that returns a unittest.TestCase, or simply contains TestCase classes. (see Django’s documentation for details).

As of Attest 0.6 you should use test cases:

# myapp/
from attest import Tests

template = Tests()

def filter():
    # ...

template = template.test_case()

This allows Django to find your tests, and allows you to run individual tests, e.g.:

python test myapp.template.test_filter


When a unittest.TestCase is created from a test collection, the function names are prefixed with test_.

Prior to Attest 0.6, you must use the test suite option, which unfortunately doesn’t support running individual tests:

from attest import Tests

template = Tests()

def filter():
    # ...

suite = template.test_suite

assert hook

Prior to Attest 0.5, the assert hook was enabled on first import of attest. As of Attest 0.6, this is no longer the case – instead it occurs when you use the attest command line program to execute tests.

Since Django uses as its entry point, django-attest enables the assert hook automatically when it’s first imported.

This means that you need to do the following:

  1. Make sure django_attest is imported as soon as possible.
  2. Add from attest import assert_hook to the top of each test module.

Django assertions

For details on each of these, see django_attest/


Assert that a response redirects to some resource:

from django_attest import redirects

response = client.get('/')
redirects(response, path="/foo/")


Assert an expected set of queries took place:

from django_attest import queries

with queries() as qs:
assert len(qs) == 5

# The same could be rewritten as
with queries(count=5):
File Type Py Version Uploaded on Size
django-attest-0.5.3.tar.gz (md5) Source 2012-09-17 6KB