Django单元测试需要很长时间才能创建测试数据库 - python

现在一段时间以来,我的单元测试花费的时间比预期的长。我尝试了几次调试,但都没有成功,因为延迟甚至在我的测试开始之前就已开始。这影响了我在远程测试驱动开发附近做任何事情的能力(也许我的期望太高了),所以我想看看我是否可以一劳永逸地解决这个问题。

运行测试时,在测试开始和实际开始之间会有70到80秒的延迟。例如,如果我为一个小模块运行测试(使用time python manage.py test myapp),我得到

<... bunch of unimportant print messages I print from my settings>

Creating test database for alias 'default'...
......
----------------------------------------------------------------
Ran 6 tests in 2.161s

OK
Destroying test database for alias 'default'...

real    1m21.612s
user    1m17.170s
sys     0m1.400s

1m:21中的大约1m18位于

Creating test database for alias 'default'...

.......

线。换句话说,测试花费了不到3秒的时间,但是数据库初始化似乎花费了1:18min

我大约有30个应用程序,大多数应用程序具有1到3个数据库模型,因此这应该可以使您了解项目的规模。我使用SQLite进行单元测试,并实现了一些建议的改进。我无法发布整个设置文件,但很高兴添加所需的任何信息。

我确实使用亚军

from django.test.runner import DiscoverRunner
from django.conf import settings

class ExcludeAppsTestSuiteRunner(DiscoverRunner):
    """Override the default django 'test' command, exclude from testing
    apps which we know will fail."""

    def run_tests(self, test_labels, extra_tests=None, **kwargs):
        if not test_labels:
            # No appnames specified on the command line, so we run all
            # tests, but remove those which we know are troublesome.
            test_labels = (
                'app1',
                'app2',
                ....
                )
            print ('Testing: ' + str(test_labels))

        return super(ExcludeAppsTestSuiteRunner, self).run_tests(
                test_labels, extra_tests, **kwargs)

在我的设置中:

TEST_RUNNER = 'config.test_runner.ExcludeAppsTestSuiteRunner'

我也尝试过使用django-nosedjango-nose-exclude
我已经阅读了很多有关如何加快测试速度的信息,但是没有找到有关如何优化或避免数据库初始化的线索。我已经看到了有关不尝试使用数据库进行测试的建议,但是我无法或不知道如何完全避免这种情况。

请让我知道

  • 这是正常现象,也是预期的
  • 不需要(以及希望做些什么的修补或引导)
  • 再说一次,我不需要帮助自己加快测试速度,而是需要初始化(或开销)。我希望上面的示例花费10秒而不是80秒。

    非常感谢

    我使用--verbose 3运行测试(针对单个应用),发现这与迁移有关:

      Rendering model states... DONE (40.500s)
      Applying authentication.0001_initial... OK (0.005s)
      Applying account.0001_initial... OK (0.022s)
      Applying account.0002_email_max_length... OK (0.016s)
      Applying contenttypes.0001_initial... OK (0.024s)
      Applying contenttypes.0002_remove_content_type_name... OK (0.048s)
      Applying s3video.0001_initial... OK (0.021s)
      Applying s3picture.0001_initial... OK (0.052s)
      ... Many more like this
    

    我压缩了所有的迁移,但仍然很慢。

    参考方案

    解决我的问题的最终解决方案是强制Django在测试期间禁用迁移,这可以通过如下设置完成

    TESTING = 'test' in sys.argv[1:]
    if TESTING:
        print('=========================')
        print('In TEST Mode - Disableling Migrations')
        print('=========================')
    
        class DisableMigrations(object):
    
            def __contains__(self, item):
                return True
    
            def __getitem__(self, item):
                return "notmigrations"
    
        MIGRATION_MODULES = DisableMigrations()
    

    或使用https://pypi.python.org/pypi/django-test-without-migrations

    我的整个测试现在大约需要1分钟,而一个小应用程序则需要5秒。

    就我而言,在迁移时更新测试时不需要进行迁移,并且不使用迁移来添加数据。这并不适合所有人

    django-getlist() - python

    我刚刚发布了这个问题jQuery - passing arrays in post request,在发布请求中我不发送数组,但是jQuery代码没有问题。问题在于在django中接收到POST请求。我确实喜欢这个def portfolio_add(request): ukeys = request.POST.getlist('ukeys'…

    django-simple-history,在admin中显示更改的字段 - python

    当我从admin.ModelAdmin继承时,在管理页面的历史记录中,我可以看到哪些字段已更改。但是,现在我需要使用django-simple-history来跟踪所有模型更改。现在,对于管理员,我继承了simple_history.SimpleHistoryAdmin。我可以看到所有模型更改并还原它们,但看不到更改了哪些字段。是否可以在SimpleHist…

    Django Python如何在给定两个时间字符串的情况下计算时差 - python

    在Django Python中,我有2个HH:mm时间字符串,如何获取持续时间(差异)?例如:15:30 and 11:00 ---> difference is 04:30 19:28 and 12:25 ---> difference is 07:03 参考方案 我们可以首先使用以下命令将字符串解析为datetime对象:from datet…

    在返回'Response'(Python)中传递多个参数 - python

    我在Angular工作,正在使用Http请求和响应。是否可以在“响应”中发送多个参数。角度文件:this.http.get("api/agent/applicationaware").subscribe((data:any)... python文件:def get(request): ... return Response(seriali…

    Python exchangelib在子文件夹中读取邮件 - python

    我想从Outlook邮箱的子文件夹中读取邮件。Inbox ├──myfolder 我可以使用account.inbox.all()阅读收件箱,但我想阅读myfolder中的邮件我尝试了此页面folder部分中的内容,但无法正确完成https://pypi.python.org/pypi/exchangelib/ 参考方案 您需要首先掌握Folder的myfo…