原来我错了。我没有测试我认为正在测试的内容...由于 Heroku 的路由网格将请求发送到不同的服务器,LiveServerTestCase 正在一台机器上启动一个 Web 服务器,而 Selenium 则完全连接到其他机器。
通过将 Heroku Procfile 更新为:
web: python src/manage.py test --liveserver=0.0.0.0:$PORT
覆盖DATABASES 设置以指向测试数据库,并自定义链接到下面的测试套件运行器(同样的想法仍然成立:覆盖setup_databases 以便它只删除/重新创建表,而不是整个数据库),我能够运行远程测试。但这更加hacky/痛苦/不雅。还在寻找更好的东西!很抱歉造成混乱。
(下面更新答案)
以下是对我有用的步骤:
- 使用 Heroku 工具带创建额外的免费 Postgres 数据库
heroku addons:add heroku-postgresql:dev
- 使用 HerokuTestSuiteRunner 类,您可以找到 here。
此自定义测试运行程序要求您定义遵循典型 DATABASES 格式的 TEST_DATABASES 设置。例如:
TEST_DATABASES = {
'default': dj_database_url.config(env='TEST_DATABASE_URL')
}
然后,将TEST_RUNNER 设置为可以找到 HerokuTestSuiteRunner 的 Python 路径。
您现在应该能够使用给定的数据库在 Heroku 上运行 Django 测试。这是一个非常快速的黑客攻击......让我知道如何改进/减少黑客攻击。享受吧!
(原答案如下)
已经讨论了一些相关的解决方案here。正如您在Django docs 中看到的,“[当]使用 SQLite 数据库引擎时,测试将默认使用内存数据库”。
虽然这并不能彻底测试您在 Heroku 上使用的数据库引擎(我仍在寻找能够做到这一点的解决方案),但将数据库引擎设置为 SQLite 至少可以让您运行测试.
请参阅上面链接的 StackOverflow question 以获取一些提示。至少有两种方法:在强制 SQLite 作为数据库引擎之前测试 if 'test' in sys.argv,或者在测试中使用专用设置文件,然后您可以使用 --settings 选项将其传递给 django manage.py test。