Skip to content

7mp/django-dynamic-fixture

 
 

Repository files navigation

Django Dynamic Fixture

Continuous Integration Status

Latest version: 1.6.5 (2013/02/27)

A complete library to create dynamic model instances for testing purposes.

Motivation

  • It is a TERRIBLE practice to use STATIC data in tests.
  • Create dynamic fixture for each model is boring and it produces a lot of replicated code.
  • It is a bad idea to use uncontrolled data in tests, like bizarre random data.

Basic Example of Usage

from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=255)

class Book(models.Model):
    name = models.CharField(max_length=255)
    authors = models.ManyToManyField(Author)
from django.test import TestCase
from django_dynamic_fixture import G

class SearchingBooks(TestCase):
    def test_search_book_by_author(self):
        author1 = G(Author)
        author2 = G(Author)
        book1 = G(Book, authors=[author1])
        book2 = G(Book, authors=[author2])
        books = Book.objects.search_by_author(author1.name)
        self.assertTrue(book1 in books)
        self.assertTrue(book2 not in books)

Installation

pip install django-dynamic-fixture

or

1. Download zip file
2. Extract it
3. Execute in the extracted directory: python setup.py install

Development version

pip install -e git+git@github.com:paulocheque/django-dynamic-fixture.git#egg=django-dynamic-fixture

requirements.txt

django-dynamic-fixture==1.6.5
# or use the development version
git+git://github.com/paulocheque/django-dynamic-fixture.git#egg=django-dynamic-fixture

Upgrade:

pip install django-dynamic-fixture --upgrade --no-deps

Requirements

  • Python 2.6 or 2.7
  • Django 1.2, 1.3 or 1.4

Comparison with another fixture tools

  • We tried to use another fixture tools in a big Django project but the experience was not satisfactory.
  • Either they are incomplete, or bugged or it produces erratic tests, because they use random and uncontrolled data.
  • Also, the syntax of others tools is too verbose, which polutes the tests.
  • Complete, lean and practice documentation.
  • It is hard to debug tests with another tools.
  • List of other tools: http://djangopackages.com/grids/g/fixtures
  • The core of the tool is the algorithm, it is not the data generation as all other tools. That mean you can change the data generation logic as you want.

Features

  • Highly customizable: you can customize fields recursively
  • Deal with unique=True
  • Deal with cyclic dependencies (including self references)
  • Deal with many to many relationship (common M2M or M2M with additional data, i.e. through='table')
  • Deal with custom fields (specially if the custom field inherit of a django field)
  • It is supported for parallel tests
  • Deal with auto calculated attributes
  • It is easy to debug errors

Other goodies

  • Nose plugin that enable a setup for the entire suite (unittest2 includes only setups for class and module)
  • Nose plugin to count how many queries are executed by test
  • Command to count how many queries are executed to save any kind of model instance
  • FileSystemDjangoTestCase that facilitate to create tests for features that use filesystem.

Documentation links

FAQ