如何從Django項目的視圖代碼(以及由視圖代碼調用的代碼)獲取代碼覆蓋率?如何在運行在gunicorn時從django應用程序獲取覆蓋數據
coverage gunicorn <params>
不顯示任何命中的行。
如何從Django項目的視圖代碼(以及由視圖代碼調用的代碼)獲取代碼覆蓋率?如何在運行在gunicorn時從django應用程序獲取覆蓋數據
coverage gunicorn <params>
不顯示任何命中的行。
coverage gunicorn <params>
不起作用,因爲gunicorn創建工作進程,並且coverage
模塊不能跨叉(基本上創建新進程)工作。您可以包含您的WSGI應用程序的Python模塊中使用the coverage API,雖然,例如:
# wsgi_with_coverage.py
import atexit
import sys
import coverage
cov = coverage.coverage()
cov.start()
from wsgi import application # adjust to python module containing your wsgi application
def save_coverage():
print >> sys.stderr, "saving coverage"
cov.stop()
cov.save()
atexit.register(save_coverage)
然後運行gunicorn -w 1 wsgi_with_coverage:application <other params>
。
問題是,如果殺死gunicorn進程,例如通過CTRL + C,則不會調用atexit
函數。但他們是呼籲SIGHUP
,所以如果你做kill -HUP $(cat <gunicorn_pidfile_here>)
,覆蓋率數據應保存(默認爲當前目錄「.coverage」)。
一個可能的警告是,這不適用於多個gunicorn工作者,因爲他們會覆蓋「.coverage」文件。如果您絕對需要多名工作人員,則可以寫入".coverage-%d" % os.getpid()
(設置文件名稱via the data_file
parameter to the coverage
constructor)並使用the combine()
method合併單個測量。
這也應該在其他WSGI服務器上工作,具體取決於它們是否允許通過atexit
方法清除其工作進程。
SIGHUP的建議是不是很好:)。 Gunicorn在檢索SIGHUP時重新加載工作進程。也就是說,收集到的覆蓋率數據完全沒有保存,而是覆蓋了僅在加載時發生的事情。另一方面,發送SIGTER會正確觸發atexit處理程序並乾淨地關閉Gunicorn。 –