Как получить данные о покрытии из приложения django при запуске в пулеметном

Как получить покрытие кода из кода представления проекта Django (и код, вызываемый кодом просмотра)?

coverage gunicorn <params> не показывает никаких ударов линий.

Ответ 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.