#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 mremolt):
Replying to [comment:18 kmtracey]: > I've looked at this a little more and figured out a few things. > > Disconnecting `close_connection` from from `request_finished` solves this problem, so that tests that use the test Client do not automatically need to use the old way, and may take advantage of the rollback approach. In the patch I'll attach the signal is disconnected/reconnected around the sending of the signal...this is probably overkill. I think it would be OK to just disconnect `close_connection` from that signal once and be done with it but I haven't had time to go back and experiment with that since I tried the first way. Great, I always wondered why the test client behaved that way and suspected threading/process problems. > Second, having the fixture teardown code attempt to detect whether a commit had been performed by the test code (despite the test case being a type that supposedly didn't use transactions) and fallback to flush/reload didn't seem to be working too well. I tried tracking down a few of the failures caused by these and eventually decided to try a different approach, which is: if it's a test case that says it doesn't need transactions to work, monkey patch the transaction commit/rollback and enter/leave transaction management routines so that even if they are called by the code being tested, they do nothing, for the duration of the test. > > > I don't know how the monkey patch idea will be received, but this approach seems to work better. Doing it this way, none of the existing Django tescases need to use the old flush/reload approach. That is, the tests that do actually call commit or rollback (like admin_views, which call admin views that are wrapped in commit_on_success) don't actually need those calls to do anything in order for the test to properly test what it is trying to test. Things work fine when those routines don't do anything, and the test fixture teardown is able to reliably un-do what the test has done, leaving things clean for the next test. What about adding signals to transaction processing? It could simplify the code here and might be useful at other places. Whenever a transaction is commited, a signal post_commit is emitted. This signal is catched by the test case and if it is a case that shouldn't need transactions, it simply throws an TransactionNotAllowedHere exception "That's evil! Please use the TestCase that can handle transactions.". That way no monkeypatching is necessary and it tells the developer what she/he is doing wrong. Instead of trying to guess if a transaction happened (was a bad idea) or deactivating transactions transparently (if a test relies on the commit, the developer will have some nice head scratching), it simply enforces the developer to use the right TestCase. What do you think? By the way, during the holidays (when that damned website is online) I can start contributing to that patch again, if my help is wanted. -- Ticket URL: <http://code.djangoproject.com/ticket/8138#comment:19> 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 django-updates@googlegroups.com To unsubscribe from this group, send email to django-updates+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/django-updates?hl=en -~----------~----~----~----~------~----~------~--~---