为什么coverage.py没有正确测量Django的runserver命令?

Ned*_*der 20 python django coverage.py

我应该知道答案,但我不知道:如果你试图测量像这样的Django项目的覆盖范围:

coverage run manage.py runserver 
Run Code Online (Sandbox Code Playgroud)

您获得的覆盖率测量错过了所有实际代码.在此过程的早期阶段就是停止测量,或者所有实际工作都在一个根本无法测量的新环境中进行.

有人能指出我在测量失败的过程中的具体点,以便我可以尝试修复coverage.py,以便它能按照人们期望的方式正确测量吗?

Vin*_*jip 24

如果你运行如下,你会得到同样的问题吗?

coverage run manage.py runserver --noreload
Run Code Online (Sandbox Code Playgroud)

没有--noreload,另一个过程在幕后开始.一个进程运行服务器,另一个进程查找代码更改并在进行更改时重新启动服务器.有可能的是,您正在监控流程而不是服务流程上进行覆盖.

看看django/core/management/commands/runserver.pydjango/utils/autoreload.py.

更新:我运行了覆盖命令,然后使用pslsof查看发生了什么.这是我观察到的:

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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

因此,为什么覆盖范围不适用于--noreload此案并不明显.在我的简短测试中--noreload,我得到了我的视图代码的覆盖范围,如以下摘录所示:

festival/__init__   8      7    13%
manage              9      4    56%
settings           33      1    97%
Run Code Online (Sandbox Code Playgroud)