Generating Fixtures

Presenter Notes

./manage.py dumpdata some_app > some_app/fixtures/test_data.json

Presenter Notes

Presumption that you have data

Data

Image source

Presenter Notes

What about time sensitive data?

Boarding pass

Image souce

Presenter Notes

Edit data through admin to re-dump after schema changes?



Drupal schema

Image source

Presenter Notes

Time sensitive tests

Model and Manager

1 class SomeManager(models.Manager):
2     def future(self):
3         return self.get_query_set().filter(pub_date__gte=datetime.today())
4 
5 class SomeClass(models.Model):
6     pub_date = models.DateField()
7     objects = SomeManager()

Test

1 class SomeManagerTest(TestCase):
2     fixtures = "some_fixtures.json"
3 
4     def test_future_method(self):
5         self.assertEqual(4, SomeClass.objects.future().count())

Presenter Notes

Tests that pass today may not pass tomorrow



bad milk

Image source

Presenter Notes

Alternative strategies

Generating fixture files

Dynamic object generators

Application based object generators

Presenter Notes

Generating fixture files
(django-fixture-generator)

Presenter Notes

 1 from fixture_generator import fixture_generator
 2 
 3 from events.models import EventCategory, Event
 4 from django.contrib.auth.models import User, Group
 5 
 6 @fixture_generator(User, requires=["events.test_categories"])
 7 def test_users():
 8     festival, tasting = EventCategory.objects.order_by("name")
 9     fortnights_festival = Event.objects.create(
10             title="Beer Fest",
11             start_date=datetime.today() - timedelta(days=14),
12             category=festival)
13     tomorrows_tasting = Event.objects.create(
14             title="Tripel Tasting",
15             start_date=datetime.today() + timedelta(days=1),
16             category=tasting)
17 
18 @fixture_generator(Category)
19 def test_categories():
20     EventCategory.objects.create(name="Tasting")
21     EventCategory.objects.create(name="Festival")

Presenter Notes

Re-generate fixtures as needed

./manage.py generate_fixture my_app.test_users

Update fixtures for date sensitivity

Modify fixture definitions for schema changes

Presenter Notes

Dynamic object generators
(django-any)

Presenter Notes

 1 class Event(models.Model):
 2     title = models.CharField(max_length=100)
 3     start_date = models.DateField(default=datetime.today())
 4     description = models.TextField()
 5 
 6 class EventTestCase(TestCase):
 7     def setUp(self):
 8         yesterday = datetime.today() - timedelta(days=1)
 9         tomorrow = datetime.today() + timedelta(days=1)
10         old_event = any_model(Event, start_date=yesterday)
11         current_event = any_model(Event)
12         future_event = any_model(Event, start_date=tomorrow)

Presenter Notes

Application based object generators

Presenter Notes

 1 class MyGeneratorMixin(object):
 2     def get_category(self, name=""):
 3         return CategoryModel.objects.create(name=name)
 4 
 5     def get_event(self, title, start_date):
 6         return EventModel.objects.create(start_date=start_date,
 7                 title=title, category=self.get_category())
 8 
 9     def setUp(self):
10         yesterday = datetime.today() - timedelta(days=1)
11         tomorrow = datetime.today() + timedelta(days=1)
12         old_event = self.get_event("Old event", start_date=yesterday)
13         future_event = self.get_event("Old event", start_date=tomorrow)
14 
15 class ModelTestCase(MyGeneratorMixin, TestCase):
16     ...
17 
18 class ViewModelTestCase(MyGeneratorMixin, TestCase):
19     ...
20 
21 class FormsTestCase(MyGeneratorMixin, TestCase):
22     ...

Presenter Notes

Final notes

Reduce coupling!

Performance differences -> unknown

Presenter Notes

Question, comments, concerns, queries?



None of the code in this presentation has been tested. Many module imports are implied.

Presenter Notes