使用 pytest-django 和设置需要 7 或 8 分钟?

问题描述

我正在为我们的 Django 站点设置 pytest 测试,完成运行单个测试(其中创建的对象少于 100 个)需要七八(7 或 8)分钟。如果我每小时只能尝试 5 件事,这感觉就像是开发测试的巨大障碍(鉴于我肯定会浪费其中的几次尝试来解决诸如文件路径中的拼写错误之类的愚蠢错误。)

平台 win32 -- Python 3.9.1、pytest-6.2.2、py-1.10.0、pluggy-0.13.1 Django 3.1.5

我们的网站使用 django-simple-history(它为每个表创建一个历史副本)和 django-taggit,并且可能有 25 个不同的应用程序,其中一些提供了广泛重复使用的模型(如果这很重要)。可能是 100 个或更多模型。我的笔记本电脑有 8Gb 内存和较旧的 i7 cpu

我在pytest.ini中设置了reusedb选项,但是没有明显的变化。这是一个可以解决的问题吗?

这是代码

import pytest

@pytest.mark.django_db
def test_proj_creation():
    for i in range(5):
        groupname = "G" + str(i)
        group = Group.objects.create(name=groupname)
        username = "U" + str(i)
        user = User.objects.create(username=username)
        user.set_password(username)
        user.groups.set(Group.objects.all())
        proj_name = "P" + str(i)
        project = Project.objects.create(project_name=proj_name)
        project.target_groups.add(group)
        assert user.groups.count() == i+1

运行时:

========================================================================================================= test session starts =========================================================================================================
platform win32 -- Python 3.9.1,pytest-6.2.2,py-1.10.0,pluggy-0.13.1
django: settings: mysite6.settings_components.development (from ini)
rootdir: C:\Users\Andrew\AzureKEN\KEN%20development,configfile: pytest.ini
plugins: django-4.1.0
collected 1 item                                                                                                                                                                                                                       

tests\pytest_site.py

这就是长时间停顿发生的地方。

那么:

========================================================================================================== warnings summary ===========================================================================================================
tests/pytest_site.py::test_proj_creation
  c:\users\andrew\djdev\lib\site-packages\django\db\models\fields\__init__.py:1367: RuntimeWarning: DateTimeField HistoricalBRVM.last_modified received a naive datetime (1901-01-01 00:00:00) while time zone support is active.
    warnings.warn("DateTimeField %s received a naive datetime (%s)"

-- Docs: https://docs.pytest.org/en/stable/warnings.html
============================================================================================== 1 passed,1 warning in 695.40s (0:11:35) ===============================================================================================

解决方法

我要回答我自己的问题——这里的问题是

@pytest.mark.django_db

调用创建一个包含所有表的空白 sqlite 数据库,这是一项大量工作。这是通过运行所有 django 迁移脚本来配置的,该过程需要很多分钟。我可以通过使用迁移“挤压”命令来减少冗余来减少这种情况。 --reuse-db 选项似乎不起作用 (?) 但无论如何,我们通常希望进行数据库更改以防止重用现有数据库。