新的一年有新的开始, 决定使用 TDD 进行开发! 但第一个问题就是: 执行一次单元测试需要 200 多秒 , 快速地测试执行俨然成为了当务之急!(正经脸🤭) 用这篇博客记录一些 django 单元测试提速的实用小技巧:
测试加速技巧🚀🚀🚀: 1. 不每次执行 migration(200s→30s) 拖累单元测试的罪魁祸首是每次初始化数据库耗费的时间 (因为我们数据库中有四百多张表, 所以特别的慢) 解决方法: pytest 的 --reuse-db
参数 (默认的测试也有--keepdb
参数)
2. 新建用户时密码加密的方式(30s→5s) 这是我最为诧异的一个提升点, 在测试的设置中, 覆盖PASSWORD_HASHERS
= ['django.contrib.auth.hashers.MD5PasswordHasher',], 竟然将测试的效率提升了 6 倍左右. # TODO: 研究一下两种加密方式的具体实现.
3. 并行运行(5s→90s???) 开启 pytest 的并行运行, 总执行时间竟然从 5s 变为了 90s... 是我打开方式不对吗???
1 2 pip install pytest-xdist pytest tests/api_v1/ --reuse-db -n 4
4. 其他:
使用 setUpTestData
去初始化数据, 而不是setUp
. 这样在下图中的测试中, 数据只会初始化一次而不是三次:
使用内存型数据库, e.g. sqlite
在 INSTALLED_APPS
中去除不需要的 app.
...
最终效果:
用 pycharm 执行的话慢了好多.. 愁人呀.
完整的配置: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 from settings import *from django.db import OperationalError, connectionsos.environ["TEST" ] = "true" DEBUG = False INSTALLED_APPS = list(INSTALLED_APPS) TEST_DB_NAME = 'test.db' DATABASES = { 'default' : { 'ENGINE' : 'django.db.backends.sqlite3' , 'NAME' : TEST_DB_NAME, 'TEST' : {'NAME' : TEST_DB_NAME} } } TEST_RUNNER = 'tests.runner.PytestTestRunner' with connections['default' ].cursor() as cursor: try : cursor.execute('SELECT ID FROM configs_usergroup LIMIT 1' ) except OperationalError: import django; django.setup() from django.core.management import call_command call_command("migrate" , interactive=False ) PASSWORD_HASHERS = [ 'django.contrib.auth.hashers.MD5PasswordHasher' , ]
reference: