4

我遇到了随机失败的单元测试这个奇怪的问题。我基本上是在测试联合供稿

这是我的代码的相关部分:

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 个工厂,并且测试随机失败。

如果我在这里的代码中遗漏了任何局部变量声明,请忽略它,因为我已经压缩了代码以使其尽可能小。

我正在考虑使用它,但结果仍然相同。

如果我可以提供更多信息,请告诉我。

这是失败的堆栈跟踪:

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

1 回答 1

3

请原谅我说的很明显。随机失败的最常见原因是您的一项测试没有正确拆除。这是随机发生的,因为执行测试的顺序是不确定的。尝试单独运行失败的测试,而不是运行整个测试套件。如果每次都通过,那么肯定是其他一些测试引起的。

另一种可能性是您可能正在重用旧的测试夹具,具体取决于您提供的运行测试的参数

于 2013-07-15T23:29:23.877 回答