现在一段时间以来,我的单元测试花费的时间比预期的长。我已经尝试调试了几次,但是没有成功,因为延迟是在我的测试甚至开始运行之前。这影响了我在远程测试驱动开发附近做任何事情的能力(也许我的期望太高了),所以我想看看我是否可以一劳永逸地解决这个问题。
运行测试时,测试的开始与实际开始之间会有70到80秒的延迟。例如,如果我针对一个小模块运行测试(使用time python manage.py test myapp),我得到
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-nose与django-nose-exclude
django-nose
django-nose-exclude
我已经阅读了很多有关如何加快测试速度的文章,但是还没有找到有关如何优化或避免数据库初始化的线索。我已经看到了有关不尝试使用数据库进行测试的建议,但是我无法或不知道如何完全避免这种情况。
请让我知道
同样,我不需要帮助自己加快测试速度,而需要初始化(或开销)。我希望上面的示例花费10秒而不是80秒。
非常感谢
我使用来运行测试(针对单个应用程序),--verbose 3发现这与迁移有关:
--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秒。
就我而言,在迁移时更新测试时不需要进行迁移,并且不使用迁移来添加数据。这并不适合所有人