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'...
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