Django Dynamic Fixture
A complete library to create dynamic model instances for testing purposes.
- Basic Example of Usage
- Django Dynamic Fixture
- Data generation options
- Other configurations
- Other goodies
- Other Links
- 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)
pip install django-dynamic-fixture
1. Download zip file 2. Extract it 3. Execute in the extracted directory: python setup.py install
pip install -e email@example.com:paulocheque/django-dynamic-fixture.git#egg=django-dynamic-fixture
django-dynamic-fixture==1.6.5 # or use the development version git+git://github.com/paulocheque/django-dynamic-fixture.git#egg=django-dynamic-fixture
pip install django-dynamic-fixture --upgrade --no-deps
- 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.
- 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
- 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.
- Simple documentation: https://github.com/paulocheque/django-dynamic-fixture/wiki/Simple-Documentation
- Full documentation: https://github.com/paulocheque/django-dynamic-fixture/wiki/Documentation
- Examples of Usage: https://github.com/paulocheque/django-dynamic-fixture/wiki/Example-of-usage
- Patterns and Anti-patterns: https://github.com/paulocheque/django-dynamic-fixture/wiki/Patterns-and-Anti-Patterns
- Wiki: https://github.com/paulocheque/django-dynamic-fixture/wiki