15

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

coverage gunicorn <params>不显示任何被击中的行。

4

1 回答 1

15

coverage gunicorn <params>不起作用,因为 gunicorn 创建工作进程,并且coverage模块不能跨叉工作(基本上,创建新进程)。不过,您可以使用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>

问题是,atexit如果您杀死 gunicorn 进程(例如通过 CTRL+C),则不会调用这些函数。但是它们调用SIGHUP,所以如果你这样做kill -HUP $(cat <gunicorn_pidfile_here>),覆盖数据应该被保存(默认为当前目录中的“.coverage”)。

一个可能的警告是,这不适用于一个以上的 gunicorn 工人,因为他们都会覆盖“.coverage”文件。如果您绝对需要多个工人,您可以写入(通过参数".coverage-%d" % os.getpid()设置文件名到构造函数)并使用方法合并各个测量值。data_filecoveragecombine()

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

于 2013-12-19T19:14:42.617 回答