Django application providing isolation for model instances created during `setUpTestData`.
Project description
Django application providing isolation for model instances created during setUpTestData.
Note: This package has been merged into Django in PR #12608, which will be released in Django 3.2.
Installation
pip install django-testdata
Motivation
Django 1.8 introduced TestCase.setUpTestData to allow costly generation of model fixtures to be executed only once per test class in order to speed up testcase instances execution.
One gotcha of setUpTestData though is that test instances all share the same model instances and have to be careful not to alter them to prevent breaking test isolation. Per Django’s documentation:
Be careful not to modify any objects created in setUpTestData() in your test methods. Modifications to in-memory objects from setup work done at the class level will persist between test methods. If you do need to modify them, you could reload them in the setUp() method with refresh_from_db(), for example.
Reloading objects in setUp() certainly works but it kind of defeats the purpose of avoiding database hits to speed up tests execution in the first place. It makes little sense to fetch model instances from the database given all the data is available in memory.
This package offers a different alternative to work around this quirk of setUpTestData. Instead of reloading objects from the database the model instances assigned as class attributes during setUpTestData are lazily deep copied on test case instance accesses. All deep copying during a test is done with a shared memo which makes sure in-memory relationships between objects are preserved.
Usage
The test data can be either wrapped manually by using testdata:
from django.test import TestCase
from testdata import testdata
from .models import Author, Book
class BookTests(TestCase):
@classmethod
def setUpTestData(cls):
cls.author = testdata(Author.objects.create(
name='Milan Kundera',
))
cls.book = testdata(cls.author.books.create(
title='Nesnesitelná lehkost bytí',
))
Or automatically by using the wrap_testdata decorator:
from django.test import TestCase
from testdata import wrap_testdata
from .models import Author, Book
class BookTests(TestCase):
@classmethod
@wrap_testdata
def setUpTestData(cls):
cls.author = Author.objects.create(
name='Milan Kundera',
)
cls.book = cls.author.books.create(
title='Nesnesitelná lehkost bytí',
)
Under the hood wrap_testdata wraps all attributes added to cls during the execution of setUpTestData() into testdata(attr, name=name).
Once test data is wrapped the testcase instance methods can alter objects retrieved from self without worrying about cross-tests isolation:
from django.test import TestCase
from testdata import wrap_testdata
from .models import Author, Book
class BookTests(TestCase):
@classmethod
@wrap_testdata
def setUpTestData(cls):
cls.author = Author.objects.create(
name='Milan Kundera',
)
cls.book = cls.author.books.create(
title='Nesnesitelná lehkost bytí',
)
def test_book_name_english(self):
self.assertEqual(self.book.title, 'Nesnesitelná lehkost bytí')
self.book.title = 'The Unbearable Lightness of Being'
self.book.save()
def test_book_name_french(self):
self.assertEqual(self.book.title, 'Nesnesitelná lehkost bytí')
self.book.title = "L'Insoutenable Légèreté de l'être"
self.book.save()
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file django-testdata-1.0.2.tar.gz
.
File metadata
- Download URL: django-testdata-1.0.2.tar.gz
- Upload date:
- Size: 5.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.24.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.57.0 CPython/3.8.2
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 44b42f68f7d73908eae1ec760d1ba7d8f514f54fe9d09fe8f5a5c2dd05904d05 |
|
MD5 | d3311518b379137014bd1310b008d8fd |
|
BLAKE2b-256 | 5b1308389f91329c7473d1df63c73ec4b4c38de189a2d9a2bd8f5151b21d2b41 |
File details
Details for the file django_testdata-1.0.2-py2.py3-none-any.whl
.
File metadata
- Download URL: django_testdata-1.0.2-py2.py3-none-any.whl
- Upload date:
- Size: 5.5 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.24.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.57.0 CPython/3.8.2
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 66019a3be9dbca434587a373c2bbfecc423ca4806bfe33d455a0e602f3190c44 |
|
MD5 | 4775eed05c0ab26a0b8023e7a068fb3c |
|
BLAKE2b-256 | 0d70bd43e1978a117dbdb2631a44e5933eec2da8f78d58fede19dbb5da36af39 |