首页 > 解决方案 > Django 测试耗时 20 分钟以上(有时)

问题描述

我有一个神秘的测试,它运行的时间比它应该运行的要长得多。我已经尝试调试它一段时间了,但我已经没有创造力了。该测试确实创建了很多数据库记录,但仍然只有几百条,我可以理解它需要一分钟,但绝对不是 20 分钟。以下是由于某种原因而窒息的相关代码:

from rest_framework.test import APITestCase

class MyTest(APITestCase, ...):

    ...

    def setUp(self):
        self.setup_questions()

    def setup_questions(self):
        question_levels = [
                QuestionLevelFactory.create(title="Major", ...),
                QuestionLevelFactory.create(title="Minor", ...),
                QuestionLevelFactory.create(title="Recommended", ...)
            ]

            questionnaire1 = QuestionnaireFactory.create(...)
            questionnaire2 = QuestionnaireFactory.create(...)

            possible_answer_set = PossibleAnswerSetFactory.create(...)

            for question_level in question_levels:
                if question_level.title == "Recommended":
                    questionnaire = questionnaire2
                    counter = 25
                else:
                    questionnaire = questionnaire1
                    counter = 100
                for i in range(counter):
                    if i <= 97:
                        question = QuestionFactory.create(
                            level_object=question_level, possible_answer_set=possible_answer_set,
                            questionnaire=questionnaire
                        )
                    else:
                        question = QuestionFactory.create(
                            level_object=question_level, possible_answer_set=possible_answer_set,
                            questionnaire=questionnaire, code="{}-{}".format(question_level.title, i)
                        )

                    if i < 95:
                        AnswerFactory.create(
                            question=question, assessment=self.assessment, value="yes"
                        )
                    elif i <= 97:
                        AnswerFactory.create(
                            question=question, assessment=self.assessment, value="not_applicable"
                        )
                    else:
                        AnswerFactory.create(
                            question=question, assessment=self.assessment, value="no",
                            justification="{} {} justification".format(question_level.title, i)
                        )

请注意,当question_levels按此顺序列出时,测试仅在处理“次要”级别时开始阻塞。第一个(“主要”)的处理速度快得多。当我切换 Minor 和 Major 时,事情从一开始就很慢。

这是我最近才开始进行的一个遗留项目,所以我不知道幕后究竟会发生什么,但老实说,我无法想象会导致这种奇怪行为的任何事情。

我在 Docker 容器中运行我的 Django 应用程序,并在另一个容器中连接到 Postgres 服务器。使用 SQLite 并没有真正的帮助,仍然需要很长时间。

相关库版本:

Django==1.9.13
django-factory-boy==0.1.6
factory-boy==2.7.0
fake-factory==0.7.2

任何建议/想法都将受到高度赞赏。

标签: pythondjangodockertestingfactory-boy

解决方案


推荐阅读