2012-12-04 83 views
17

我有一個部署到Heroku的應用程序,我希望能夠在目標環境中運行測試套件後部署。我正在使用Heroku Postgres加載項,這意味着我只能訪問單個數據庫。我沒有權限創建新的數據庫,這意味着標準的Django測試命令失敗,因爲它不能創建test_ *數據庫。如何在Heroku上運行Django測試

$ 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 

有沒有辦法解決這個問題?

回答

11

原來我錯了。我沒有測試我認爲正在測試的內容......由於Heroku的路由網格向不同的服務器發送請求,LiveServerTestCase在一臺機器上啓動了一臺Web服務器,Selenium完全連接到其他機器上。

通過更新Heroku的Procfile到:

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

重寫DATABASES設置爲指向測試數據庫和自定義鏈接到下面的測試套件轉輪(同樣的想法仍然成立:覆蓋setup_databases所以它只能刪除/重新創建表,而不是整個數據庫),我能夠運行遠程測試。但是這更加晦澀/痛苦/不雅。仍在尋找更好的東西!對此感到抱歉。


(以下更新答案)

這裏是爲我工作的步驟:

  • 使用Heroku的工具區

heroku addons:add heroku-postgresql:dev

創建一個額外的,免費的Postgres數據庫
  • 使用HerokuTestSuiteRunner類,你會發現here

這個自定義的測試運行,您需要定義哪些如下典型DATABASES格式TEST_DATABASES設置。例如:

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

然後,有TEST_RUNNER設置是一個Python路徑到哪裏HerokuTestSuiteRunner可以找到。

您現在應該可以使用給定的數據庫在Heroku上運行Django測試。這是一個非常快速的黑客攻擊......讓我知道如何改進/減少黑客行爲。請享用!



(下原來的答案)

一些相關的解決方案進行了討論here。正如你可以在Django docs中看到的那樣,「如果使用SQLite數據庫引擎,測試將默認使用內存數據庫」。

儘管這並沒有徹底地測試你在Heroku上使用的數據庫引擎(我仍然在尋找一種解決方案),但將數據庫引擎設置爲SQLite將至少允許您運行試驗。

查看上面鏈接的StackOverflow question的一些指針。至少有兩種方法:在強制SQLite作爲數據庫引擎之前測試if 'test' in sys.argv,或者在測試中使用專用設置文件,然後使用--settings選項將其傳遞到django manage.py test

+2

感謝Greg - 使用SQLite並不是一個真正的選擇 - 我們遇到了一些可怕的問題,這些問題是隨着SQLite(沒有限制/一致性檢查)傳遞,隨後在現場爆發。目前的解決方案是將Heroku複製到VM中的位置(使用Vagrant)並在那裏運行。工作很好,迄今沒有災難。 –

+1

感謝雨果,很高興知道。我不會使用SQLite進行測試,因爲(我在生產中使用Postgres)。爲什麼不添加一個額外的,免費的'heroku-postgresql:dev'數據庫到您的環境中,測試可以運行?從我可以收集的內容來看,可能會有多個相同插件的實例。 –

+0

既然*是個好主意。我會試試看。 –

1

從版本1.8開始,Django現在有一個名爲keepdb的選項,它允許在測試過程中重複使用相同的數據庫。

--keepdb選項可用於在測試運行之間保留測試數據庫。

這具有跳過創建和銷燬操作的優點,這可以大大減少運行測試的時間,尤其是在大型測試套件中。

如果測試數據庫不存在,它將在第一次運行時創建,然後爲每次後續運行保留。

在運行測試套件之前,任何未應用的遷移也將應用於測試數據庫。

因爲它也允許測試數據庫之前,運行測試存在,你可以簡單地一個新的Heroku Postgres的實例添加到您的賽道,並配置測試使用特定的數據庫。

紅利:您還可以使用failfast選項,該選項會在第一次測試崩潰後立即退出,以便您不必等待所有測試完成。

但是,如果要部署的東西的Heroku和您使用Heroku的管道,一個更好的選項可用:Heroku CI