Почему cover.py правильно не измеряет команду runserver в Django? - PullRequest
20 голосов
/ 13 августа 2011

Я должен знать ответ на этот вопрос, но я не знаю: если вы попытаетесь измерить охват проекта Django следующим образом:

coverage run manage.py runserver 

вы получаете измерение покрытия, которое пропускает весь ваш фактический код. Что-то в начале процесса останавливает измерение, или вся реальная работа происходит в новом контексте, который вообще не измеряется.

Может ли кто-нибудь указать мне на конкретную точку процесса, где измерение нарушается, чтобы я мог попытаться исправить файл cover.py, чтобы он измерял его должным образом, как ожидают люди?

1 Ответ

24 голосов
/ 13 августа 2011

У вас возникает такая же проблема, если вы запускаете следующим образом?

coverage run manage.py runserver --noreload

Без --noreload другой процесс запускается за сценой. Один процесс запускает сервер, другой ищет изменения кода и перезапускает сервер после внесения изменений. Скорее всего, вы выполняете покрытие в процессе мониторинга, а не в процессе обслуживания.

Посмотрите на django/core/management/commands/runserver.py и django/utils/autoreload.py.

Обновление: Я запустил команду покрытия, затем использовал ps и lsof, чтобы посмотреть, что происходит. Вот что я заметил:

ps output:

UID        PID  PPID  C STIME TTY          TIME CMD

vinay    12081  2098  0 16:37 pts/0    00:00:00 /home/vinay/.virtualenvs/watfest/bin/python /home/vinay/.virtualenvs/watfest/bin/coverage run manage.py runserver
vinay    12082 12081  2 16:37 pts/0    00:00:01 /home/vinay/.virtualenvs/watfest/bin/python manage.py runserver

lsof output:

python    12082      vinay    5u     IPv4      48294      0t0        TCP localhost:8000 (LISTEN)

IOW, даже перед любой перезагрузкой есть два процесса, и тот, который прослушивает порт TCP, не тот, на котором выполняется покрытие.

Вот что я вижу с --noreload:

ps output:

UID        PID  PPID  C STIME TTY          TIME CMD

vinay    12140  2098  5 16:44 pts/0    00:00:00 /home/vinay/.virtualenvs/watfest/bin/python /home/vinay/.virtualenvs/watfest/bin/coverage run manage.py runserver --noreload

lsof output:

coverage  12140      vinay    4u     IPv4      51995      0t0        TCP localhost:8000 (LISTEN)

Так что не очевидно, почему покрытие не будет работать в случае --noreload. В моем очень коротком тесте с --noreload я получил покрытие моего кода представления, как показано в следующей выдержке:

festival/__init__   8      7    13%
manage              9      4    56%
settings           33      1    97%
...