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



我正在为我们的Django站点设置pytest测试,它需要花费七到八(7或8)分钟来完成运行单个测试,其中创建的对象少于100个。如果我一个小时只能尝试五件事,这感觉将是开发测试的巨大障碍(考虑到我肯定会浪费一些愚蠢的错误,比如文件路径中的拼写错误。)

平台win32——Python 3.9.1, pytest-6.2.2, py-1.10.0, plugin -0.13.1Django 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:UsersAndrewAzureKENKEN%20development, configfile: pytest.ini
plugins: django-4.1.0
collected 1 item                                                                                                                                                                                                                       
testspytest_site.py

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

:

========================================================================================================== warnings summary ===========================================================================================================
tests/pytest_site.py::test_proj_creation
c:usersandrewdjdevlibsite-packagesdjangodbmodelsfields__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选项似乎不起作用(?),但在任何情况下,我们通常期望有数据库更改,这将阻止现有数据库的重用。

最新更新