如何在gunicorn中运行时从django应用程序获取覆盖数据

时间:2013-09-26 10:09:35

标签: django gunicorn coverage.py

如何从Django项目的视图代码(以及视图代码调用的代码)中获取代码覆盖率?

coverage gunicorn <params>未显示任何行被点击。

1 个答案:

答案 0 :(得分:14)

coverage gunicorn <params>不起作用,因为gunicorn创建了工作进程,而coverage模块无法跨越分支(基本上是创建新进程)。但是,您可以使用the coverage API,例如在包含WSGI应用程序的python模块中:

# 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进程,则不会调用atexit函数,例如通过CTRL + C.但是他们在SIGHUP上调用 ,所以如果你执行kill -HUP $(cat <gunicorn_pidfile_here>),则应保存覆盖率数据(默认情况下为当前目录中的“.coverage”)。

一个可能的警告是,这不适用于多个gunicorn worker,因为它们都会覆盖“.coverage”文件。如果您绝对需要多个工作人员,则可以写信至".coverage-%d" % os.getpid()(设置文件名via the data_file parameter to the coverage constructor)并使用the combine() method合并各个测量值。

这也适用于其他WSGI服务器,具体取决于它们是否允许通过atexit方法清理其工作进程。