gregmuellegger/django-autofixture

Frequently got ``TransactionManagementError``

Closed this issue · 6 comments

I used this in tests, there's almost 50 unit tests now. But when running test with nosetests command, sometimes I got TransactionManagementError. Full traceback is listed below:

======================================================================
ERROR: test suite for <class 'trades.tests.test_pingpp.TestPingpp'>
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/local/Cellar/numpy/1.11.0/libexec/nose/lib/python2.7/site-packages/nose/suite.py", line 209, in run
    self.setUp()
  File "/usr/local/Cellar/numpy/1.11.0/libexec/nose/lib/python2.7/site-packages/nose/suite.py", line 292, in setUp
    self.setupContext(ancestor)
  File "/usr/local/Cellar/numpy/1.11.0/libexec/nose/lib/python2.7/site-packages/nose/suite.py", line 315, in setupContext
    try_run(context, names)
  File "/usr/local/Cellar/numpy/1.11.0/libexec/nose/lib/python2.7/site-packages/nose/util.py", line 471, in try_run
    return func()
  File "/Users/windrunner/bxzz/phantasm/phantasm/tests/base.py", line 43, in setUpClass
    AutoFixture(model).create(10)
  File "/usr/local/lib/python2.7/site-packages/autofixture/base.py", line 550, in create
    instance = self.create_one(commit=commit, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/autofixture/base.py", line 498, in create_one
    process = self.check_constraints(instance)
  File "/usr/local/lib/python2.7/site-packages/autofixture/base.py", line 454, in check_constraints
    constraint(self.model, instance)
  File "/usr/local/lib/python2.7/site-packages/autofixture/constraints.py", line 37, in unique_constraint
    if model._default_manager.filter(**check).exists():
  File "/usr/local/lib/python2.7/site-packages/django/db/models/query.py", line 586, in exists
    return self.query.has_results(using=self.db)
  File "/usr/local/lib/python2.7/site-packages/django/db/models/sql/query.py", line 484, in has_results
    return compiler.has_results()
  File "/usr/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 811, in has_results
    return bool(self.execute_sql(SINGLE))
  File "/usr/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 840, in execute_sql
    cursor.execute(sql, params)
  File "/usr/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 59, in execute
    self.db.validate_no_broken_transaction()
  File "/usr/local/lib/python2.7/site-packages/django/db/backends/base/base.py", line 327, in validate_no_broken_transaction
    "An error occurred in the current transaction. You can't "
TransactionManagementError: An error occurred in the current transaction. You can't execute queries until the end of the 'atomic' block.

It's hard to tell without any further context. I sometimes get this error message for the first query of all following tests if one previous test fails. So this might not be a problem with django-autofixture, but surfacing there since autofixture might be the first library that executes a query in your test.

Can you try to run the tests just with one single test case and see if the traceback is more meaningful?

@gregmuellegger I go this error several times, usually there's no error with my tests. I run tests with django-nose, related configs are:

# django-nose
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
NOSE_ARGS = ['--with-spec', '--spec-color']

In my base test class, I defined some serUpClass code and tearDownClass code which might matter:

class BaseTestCase(TestCase):
    @classmethod
    def setUpClass(cls):
        super(BaseTestCase, cls).setUpClass()

        for model in cls.models:
            AutoFixture(model).create(10)

    @classmethod
    def tearDownClass(cls):
        for model in cls.models:
            model.objects.all().delete()
        super(ManagerCase, cls).tearDownClass()

BTW, I'm using django 1.8.11 and django_nose 1.4.3 and autofixture 0.12.0.

Can you reproduce the same error if you run only one testcase?

@gregmuellegger Sorry I cannot, it frequently that time, but be rarely later. And I haven't seen for a long time now. When I comes, I just need to rerun the tests again or twice, it would disappear.

But I almost not change my tests, only add a few new tests sometime.

Hm, randomly failing tests are a strange thing. Let's see if it comes back :) all thumbs pressed.

Yeah, and hard to debug. Maybe there's some race or database destroying issue, i guess.