22

我有一个部署到 Heroku 的应用程序,我希望能够在目标环境上运行测试套件。我正在使用 Heroku Postgres插件,这意味着我只能访问单个数据库。我无权创建新数据库,这反过来意味着标准 Django 测试命令失败,因为它无法创建 test_* 数据库。

$ heroku run python manage.py test
Running `python manage.py test` attached to terminal... up, run.9362
Creating test database for alias 'default'...
Got an error creating the test database: permission denied to create database

有没有办法解决?

4

2 回答 2

14

原来我错了。我没有测试我认为正在测试的东西......由于 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

此自定义测试运行程序要求您定义TEST_DATABASES遵循典型DATABASES格式的设置。例如:

TEST_DATABASES = {
    'default': dj_database_url.config(env='TEST_DATABASE_URL')
}

然后,将TEST_RUNNER设置设置为可以找到 HerokuTestSuiteRunner 的 Python 路径。

您现在应该能够使用给定的数据库在 Heroku 上运行 Django 测试。这是一个非常快速的黑客攻击......让我知道如何改进/减少黑客攻击。享受!



(下面的原始答案)

这里讨论了一些相关的解决方案。正如您在Django 文档中所读到的,“[当]使用 SQLite 数据库引擎时,测试将默认使用内存数据库”。

虽然这并没有彻底测试您在 Heroku 上使用的数据库引擎(我仍在寻找可以做到这一点的解决方案),但将数据库引擎设置为 SQLite 至少可以让您运行测试。

有关一些提示,请参阅上面链接的 StackOverflow问题。至少有两种方法:if 'test' in sys.argv在强制 SQLite 作为数据库引擎之前进行测试,或者在测试中使用专用的设置文件,然后您可以django manage.py test使用该--settings选项将其传递给。

于 2013-01-17T05:42:32.723 回答
3

从 1.8 版开始,Django 现在有一个名为keepdb的选项,它允许在测试期间重用相同的数据库。

--keepdb 选项可用于在测试运行之间保留测试数据库。

这具有跳过创建和销毁操作的优点,这可以大大减少运行测试的时间,尤其是在大型测试套件中。

如果测试数据库不存在,它将在第一次运行时创建,然后为每次后续运行保留。

在运行测试套件之前,任何未应用的迁移也将应用于测试数据库。

由于它还允许在运行测试之前存在测试数据库,因此您只需将一个新的 Postgres Heroku 实例添加到您的 dyno 并配置测试以使用该特定数据库。

奖励:您还可以使用failfast选项,该选项会在您的第一个测试崩溃后立即退出,这样您就不必等待所有测试完成。

但是,如果您将事物部署到 Heroku 并且您正在使用 Heroku Pipelines,则可以使用更好的选择:Heroku CI

于 2017-09-15T11:06:02.767 回答