如何从Django项目的视图代码(以及视图代码调用的代码)中获得代码覆盖率?coverage gunicorn <params>
不显示任何被点击的行。
最佳答案
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>
。问题是,如果您通过例如CTRL + C杀死了gunicorn进程,则不会调用
atexit
函数。但是它们是在SIGHUP
上调用的,因此,如果执行kill -HUP $(cat <gunicorn_pidfile_here>)
,则应该保存coverage数据(默认为当前目录中的“ .coverage”)。一个可能的警告是,这将不适用于多个gunicorn工作者,因为他们都会覆盖“ .coverage”文件。如果您绝对需要多个工作人员,则可以写入
".coverage-%d" % os.getpid()
(设置文件名via the data_file
parameter to the coverage
constructor),然后使用the combine()
method合并各个度量。这也应适用于其他WSGI服务器,这取决于它们是否允许其工作进程通过
atexit
方法清除。关于django - 在Gunicorn中运行时如何从Django应用程序获取覆盖率数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19025336/