我遇到了随机失败的单元测试这个奇怪的问题。我基本上测试联合供稿
以下是我的代码的相关部分:
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()
工厂:
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
每次运行测试时,都会创建3个工厂,测试会随机失败。
如果我在这里遗漏了代码中的任何局部变量声明,请忽略它,因为我已经压缩了代码以使其尽可能小。
我正在考虑using this,但结果仍然相同。
如果我能提供更多信息,请告诉我。
这是失败的堆栈跟踪:
======================================================================
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'...
下次我运行时,
======================================================================
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'...
答案 0 :(得分:2)
请原谅我陈述的明显。随机失败的最常见原因是您的某个测试没有正确拆除。这是随机发生的,因为执行测试的顺序是非确定性的。尝试单独运行失败的测试,而不是运行整个测试套件。如果它每次都通过,那么它肯定是由其他一些测试引起的。
另一种可能性是您可能会重新使用旧的测试夹具,具体取决于您提供的参数来运行测试