#8138: Switch django tests to use transactions
----------------------------------------+-----------------------------------
Reporter: mremolt | Owner: nobody
Status: new | Milestone: post-1.0
Component: Testing framework | Version: SVN
Resolution: | Keywords:
Stage: Accepted | Has_patch: 1
Needs_docs: 0 | Needs_tests: 0
Needs_better_patch: 0 |
----------------------------------------+-----------------------------------
Comment (by ericholscher):
It appears that Ellington has a custom test runner for doc tests
(basically the patch from #5624). I missed this earlier (and that explains
why there was no difference between the above patches in my reply before
this).
We are currently doing a flush and then a loaddata on fixtures found in
doctests. We are loading fixtures in the doc tests, and not cleaning them
up (until next time around when a flush occurs it seems.) I believe that a
unit test is being run in between all of these instances, probably rolling
back the transaction at the end (as I understand it, my database knowledge
is lacking), which is allowing the rest of the tests to pass.
The good news is that I now have the entire ellington suite passing with
the above behavior (with 11x speed increase). We had a couple instances of
tests relying on a previous test's data sticking around, and one instance
of a test depending on the pk of it's contents to pass. Fixing those up
allowed me to make all of the test suite pass.
Taking out the flushing threw things through a loop. With the tzcommit
patch, I was getting some collision of slug fields. This was caused by
incomplete fixtures that didn't have a slug, and used to work because
there wasn't another thing of that value being set in that test. These are
now fixed.
I think that it will be possible to get the full suite running on the
patch that does doctest transaction rollbacks. However, since we are
loading fixtures outside of the doctest runner currently, I am getting
some bleed over on tests. I'm assuming this is because the loaddata is
happening before the call to the DoctestRunner. If we put this fixture
loading logic there, inside the transaction, I think all tests would now
pass. I think the fact that we're using fixtures in doctests basically
makes it so that we have to run a custom test runner (unless #5624 gets
accepted, where transactions would almost be necessary around doctests...
This would solve the inconsistency, and give a reason to have rollbacks on
doctests.)
An interesting benchmark; the test suite when I take out the flush took
around 180s to run. (This is almost around a real 30x speed increase, and
3x faster than with the flush.). Unit tests seem to gain even more
performance from transactions because the database was being flushed
before every test (IIRC).
Sorry about the false report before, and let me know if there's anything
else I can do. I'll spend some time tomorrow trying to get our suite
passing without flushing of the DB, probably by moving out fixture loading
inside the transaction in doctests.
--
Ticket URL: <http://code.djangoproject.com/ticket/8138#comment:27>
Django <http://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/django-updates?hl=en
-~----------~----~----~----~------~----~------~--~---