如何在Heroku上运行Django测试

时间:2012-12-04 14:38:55

标签: 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

有什么方法吗?

2 个答案:

答案 0 :(得分:11)

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

将Heroku Procfile更新为:

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

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


(下面更新的答案)

以下是对我有用的步骤:

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

heroku addons:add heroku-postgresql:dev

  • 使用 HerokuTestSuiteRunner 类,您将找到here

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

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

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

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



(原始答案如下)

已经讨论了一些相关的解决方案here。正如你可以在Django docs中读到的那样,“使用SQLite数据库引擎,测试将默认使用内存数据库”。

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

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

答案 1 :(得分:1)

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

  

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

     

这有利于跳过create和destroy操作,这可以大大减少运行测试的时间,特别是那些在大型测试套件中的测试。

     

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

     

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

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

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

但是,如果您要将内容部署到Heroku并且您正在使用Heroku管道,则可以使用更好的选项:Heroku CI