如何在Heroku上运行Django测试

Hug*_*own 20 django heroku

我有一个部署到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
Run Code Online (Sandbox Code Playgroud)

有没有办法解决?

Gre*_*sky 12

事实证明我错了.我没有测试我认为正在测试的内容......由于Heroku的Routing Mesh正在向不同的服务器发送请求,LiveServerTestCase在一台机器上启动了一个Web服务器,而Selenium正在连接到其他机器.

通过将Heroku Procfile更新为:

web: python src/manage.py test --liveserver=0.0.0.0:$PORT

覆盖DATABASES设置以指向测试数据库,并自定义链接到下面的测试套件转轮(同样的想法仍然保留:覆盖setup_databases以便它只删除/重新创建表,而不是整个数据库),我能够运行远程试验.但这更加愚蠢/痛苦/不优雅.还在寻找更好的东西!对此感到抱歉.


(下面的更新答案)

以下是适合我的步骤:

  • 使用Heroku工具带创建一个额外的免费Postgres数据库

heroku addons:add heroku-postgresql:dev

  • 使用您可以在这里找到的HerokuTestSuiteRunner类.

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

TEST_DATABASES = {
    'default': dj_database_url.config(env='TEST_DATABASE_URL')
}
Run Code Online (Sandbox Code Playgroud)

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

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



(原答案如下)

这里讨论了一些相关的解决方案.正如您可以在Django文档中读到的那样,"使用SQLite数据库引擎时,测试将默认使用内存数据库".

虽然这并没有彻底测试你在Heroku上使用的数据库引擎(我还在寻找能够解决这个问题的解决方案),但是将数据库引擎设置为SQLite至少可以让你运行测试.

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

  • 谢谢Greg - 使用SQLite并不是一个真正的选择 - 我们遇到了一些可怕的问题,这些问题是由SQLite传递的测试(没有约束/一致性检查)导致的.目前的解决方案是尽可能在VM中复制Heroku(使用Vagrant)并在那里运行它们.工作得很好,到目前为止没有灾难. (2认同)