Search code examples
pythondjangopython-2.7django-unittest

Django Unittests Failing Randomly


I am running into this wierd issue of randomly failing unittests. I am basically testing Syndication Feeds

Here is the relevant portion of my code:

class ObjectFeedTests(PuppyTestCase):

    def test_object_feeds(self):
        site = Site.objects.get_or_create(id=site_id)[0]

        #Some preprocessing and initialization

        with self.settings(ROOT_URLCONF='myapp.urls.something'):

            #Some more preprocessing is done here

            show = ShowFactory.create(slug=show_slug, title=show_name,
                                      site=site)

            for feed_name, entry_points in OBJECT_FEEDS.items():

                factory = default_factories[model] #fetches the correct factory

                if feed_name == "podcast":
                    instance = factory.create(show=show, slug="podcasts")
                else:
                    instance = factory.create()

                #Creates the instance with the factory correctly

                for feed_type in ['rss', 'atom']:

                    with self.settings(SITE_ID=site.id):
                        class_url_pattern = feed_class().get_url_pattern()

                    slug_of_note = '%s/%s' % (show_slug, instance.slug)
                    presumed_url = '/%s/%s/%s' % (FEED_URL_PREFIXES[feed_type],
                                           feed_name, slug_of_note)

                    with self.settings(SITE_ID=site.id):
                        response = self.client.get(presumed_url,
                                        {'password': '****'})

                    self.assertContains(response, '<?xml',
                        msg_prefix="%s %s feed raised a 404 \
                        or wasn't XML (tried %s)" \
                            % (feed_name, feed_type, presumed_url))

                # End of our loop.  We'll delete the object
                # so that we're not hung up by unique_together constraints
                instance.delete()

The factory:

class ShowFactory(factory.Factory):
    FACTORY_FOR = Show

    title = factory.Sequence(lambda name: 'My Show {0}'.format(name))
    slug = factory.Sequence(lambda name: 'my-show-{0}'.format(name))
    creator = factory.SubFactory(UserFactory)
    last_editor = factory.SubFactory(UserFactory)
    site = factory.SubFactory(SiteFactory)
    status = STATUS_CHOICES.PUBLISHED

Each time I run the test, 3 factories are created, and the tests fail randomly.

If I have left out any local variable declaration in the code here, please ignore it, as I have condensed the code to keep it as small as possible.

I was considering using this, but the results were still the same.

Please let me know if there is any more information I could provide.

Here is the stacktrace of a failure:

======================================================================
FAIL: test_object_feeds (tests.syndication_tests.ObjectFeedTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "tests/cases.py", line 44, in run
    testMethod()
  File "tests/syndication_tests.py", line 370, in test_object_feeds
    presumed_url))
  File "/usr/local/virtualenvs/lib/python2.6/site-packages/django/test/testcases.py", line 622, in assertContains
    " (expected %d)" % (response.status_code, status_code))
AssertionError: 404 != 200 : people rss feed raised a 404                             or wasn't XML (tried /feeds/show/test-show-0): Couldn't retrieve content: Response code was 404 (expected 200)

----------------------------------------------------------------------

Ran 5 tests in 10.613s

FAILED (failures=1)
Destroying test database for alias 'default'...

The next time I run it,

======================================================================
FAIL: test_object_feeds (tests.syndication_tests.ObjectFeedTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "tests/cases.py", line 44, in run
    testMethod()
  File "tests/syndication_tests.py", line 370, in test_object_feeds
    presumed_url))
  File "/usr/local/virtualenvs/lib/python2.6/site-packages/django/test/testcases.py", line 622, in assertContains
    " (expected %d)" % (response.status_code, status_code))
AssertionError: 404 != 200 : channels rss feed raised a 404                             or wasn't XML (tried /feeds/show/test-show-1): Couldn't retrieve content: Response code was 404 (expected 200)

----------------------------------------------------------------------
Ran 5 tests in 3.483s

FAILED (failures=1)
Destroying test database for alias 'default'...

Solution

  • Please forgive me for stating the obvious. The most common cause for random failure is that one of your tests did not tear down properly. This happens randomly because the order in which the tests are executed is non-deterministic. Try running the failed test alone instead of running the whole test suite. If it passes every time, then it is definitely caused by some other tests.

    Another possibility is that you may be reusing the old test fixture depending on the arguments you provide to run your tests