如何使用pytest-django在Heroku上针对现有数据库运行Django测试?
我之前在Heroku上折腾过pytest-django的测试部署,刚好能给你两个可行的方案参考:
方案一:直接使用现有数据库运行测试(不推荐,但应急可用)
首先必须强调:直接在生产数据库上跑测试风险极高,测试用例可能会修改、删除数据,哪怕有事务回滚也难保不出意外。如果一定要这么做,务必先给数据库做完整备份,最好是用生产库的副本而非原库。
具体配置步骤:
- 在项目根目录创建或修改
pytest.ini文件,添加以下配置:
这里[pytest] django_settings_module = 你的项目名.settings django_db_createdb = False django_db_keepdb = Truedjango_db_createdb = False会告诉pytest-django不要自动创建新的测试数据库,django_db_keepdb = True则避免测试后删除现有数据库。 - 确保你的Django配置中,
DATABASES指向目标数据库(生产库或其副本)。如果是在Heroku上,直接用环境变量里的DATABASE_URL即可。 - 额外提醒:默认情况下Django测试会用事务包裹测试用例并在结束后回滚,但如果你的测试涉及到非事务性操作(比如信号、第三方API调用),可能还是会污染数据,一定要谨慎。
方案二:在Heroku上自动创建测试数据库(更安全的推荐方案)
其实Heroku是支持创建临时测试数据库的,只是需要调整配置来适配pytest-django:
准备测试数据库资源
首先确认你的Heroku Postgres计划支持创建额外数据库(大部分付费计划都可以,免费计划可能有额度限制)。你可以通过Heroku CLI提前创建测试库:heroku pg:create TEST_DATABASE --app 你的应用名之后Heroku会自动给你生成对应的环境变量(比如
HEROKU_POSTGRESQL_XXX_URL)。配置pytest-django动态使用测试库
在项目根目录的conftest.py中添加以下代码,让pytest自动切换到测试数据库:import os import django from django.conf import settings from django.db.utils import parse_db_url def pytest_configure(config): # 获取Heroku提供的测试数据库URL,没有则自动从生产库URL生成 test_db_url = os.environ.get('TEST_DATABASE_URL') or os.environ.get('DATABASE_URL').replace('/prod_db_name', '/prod_db_name_test') # 解析URL并更新Django数据库配置 test_db_config = parse_db_url(test_db_url) settings.DATABASES['default'] = test_db_config # 明确告知Django要创建测试库(如果不存在的话) settings.TEST['DATABASES']['default'] = { **test_db_config, 'TEST': {'CREATE_DB': True} }在Heroku上运行测试
你可以把测试命令加到Heroku的Procfile或者用heroku run直接执行:heroku run pytest --app 你的应用名pytest-django会自动识别配置,创建并使用测试数据库,测试完成后也可以选择保留或删除测试库(如果想保留可以加
--keepdb参数)。进阶:用临时测试环境隔离
更稳妥的方式是用Heroku Pipelines创建临时测试应用,把代码部署到临时应用后再运行测试,测试完成后销毁临时应用即可,完全不会影响生产环境。
内容的提问来源于stack exchange,提问作者lmr2391
相关产品推荐
相关产品推荐

