Ответ 1
coverage gunicorn <params>
не работает, потому что gunicorn создает рабочие процессы, а модуль coverage
не может работать через forks (в основном, создание новых процессов). Вы можете использовать API покрытия, хотя, например, в модуле python, который содержит ваше приложение WSGI:
# 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
не вызываются, если вы убиваете процесс пушки, например, с помощью CTRL + C. Но они вызываются на SIGHUP
, поэтому, если вы делаете kill -HUP $(cat <gunicorn_pidfile_here>)
, данные покрытия должны быть сохранены (по умолчанию ".coverage" в текущем каталоге).
Возможная оговорка заключается в том, что это не сработает с несколькими рабочими-оружейниками, потому что все они будут перезаписывать файл ".coverage". Если вам абсолютно нужно больше одного рабочего, вы можете написать ".coverage-%d" % os.getpid()
(укажите имя файла с помощью параметра data_file
конструктору coverage
) и используйте метод combine()
, чтобы объединить отдельные измерения.
Это должно работать и на других серверах WSGI, в зависимости от того, разрешают ли они очищать рабочие процессы с помощью метода atexit
.