#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 kmtracey):
I actually think it should be relatively easy for developers to know that
what they are testing requires working transaction methods. You need, for
example, to be testing that in a sequence of n updates where some will
succeed but ultimately a failure will be encountered causing the whole set
to be rolled back, to be testing to make sure that some of the initial DB
updates that were made were actually rolled back by the subsequent
failure. This sort of test will not be able to work with the do-nothing
transaction routines, it would have to use !TransactionTestCase to run
successfully, and I think the failure when run under a simple !TestCase
would be pretty obvious.
As for commit, I think it would be relatively hard to write a test that
will notice an expected commit has not been done, since you'd have to
somehow do a query from outside the context of the test case transaction
to be able to tell that what would ordinarily have been committed by the
code under test hasn't actually been committed yet.
I also think it's pretty nice to be able to get the speedup offered by the
rollback test approach even for code under test that calls transaction
routines, when in fact the tests don't need those routines to be
functional in order to correctly test what they are intending to test.
The admin views fall into this category. The edit view, for example, is
wrapped in commit_on_success, which if running on a transaction-supporting
database provides a nice all-or-nothing guarantee for, say, multiple
updates to inine-edited objects. But we don't have any tests for that
guarantee (they would necessarily fail on MySQL/MyISAM). So as far as the
admin_views tests are concerned any commits/rollbacks done by the code
under test aren't critical to the proper functioning of the test. It
would seem a shame to require these tests to take the performance hit of
having to use the flush/load test approach simply because admin provides
the all-or-nothing behavior when run on a transaction-supporting DB.
So it seems the more I think about it the more I like the monkey-patching
approach, personally. (I am perhaps being unduly influenced by being able
to run the full Django test suite on one of my machines now in under 10
minutes where before near an hour was the minimum...and under and hour
even on my very slow old test machines where before a day or overnight run
was required.)
I'll be around over the holidays but won't have much time free since I'll
have family visiting. If you (or anyone) could figure out the PostgreSQL
time issue that would be a good thing to fully understand before moving
forward with this. Also if there's a more elegant way to test for "the DB
rollback works" and what the consequences of it not working are w.r.t.
!DoctTests. Is what's in the patch I attached last night equivalent to
the old approach when run on a non-transaction-supporting DB given that
the fixture loading for unit tests will flush/reload, making it no big
deal that the rollback after a !DocTest run does nothing? The old
approach didn't appear to bracket !DocTests with any sort of DB
flush/reload so maybe thing are OK there, but I didn't pay a whole lot of
attention to the !DocTest bits as I was looking at this since most of the
errors I was hitting had to do with unit tests.
--
Ticket URL: <http://code.djangoproject.com/ticket/8138#comment:20>
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
-~----------~----~----~----~------~----~------~--~---