Skip to content
This repository has been archived by the owner on Jun 4, 2022. It is now read-only.

michaelmior/django-dynamic-fixture

 
 

Repository files navigation

Django Dynamic Fixture

Continuous Integration Status

A full and popular (more than 10.000 downloads) library to create dynamic model instances for testing purposes.

Installation

pip install django-dynamic-fixture

or

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

Upgrade:

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

Requirements

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

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.

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

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.

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)

Documentation

FAQ