【发布时间】:2026-02-15 23:25:01
【问题描述】:
一段时间以来,我的单元测试花费的时间比预期的要长。我尝试调试了几次,但都没有成功,因为延迟甚至在我的测试开始运行之前。这影响了我做任何接近测试驱动开发的远程操作的能力(也许我的期望太高了),所以我想看看我是否可以一劳永逸地解决这个问题。
运行测试时,从开始到实际开始测试之间有 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:18 分钟
我有大约 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-nose 和django-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
我压缩了所有迁移,但仍然很慢。
【问题讨论】:
-
非常有帮助。尤其是
verbose选项。在我们的项目中,有数百个迁移,其中一些显然需要一秒钟才能完成。对于使用 PyCharm (Pro) 的用户,您可以将--verbose 3(或-v 3)添加到测试的运行配置中(在“选项:”下)。
标签: python django django-unittest django-nose