使用Django调试服务器的代码覆盖率

3 投票
1 回答
1639 浏览
提问于 2025-04-16 23:03

我正在使用来自 http://nedbatchelder.com/code/coverage/ 的 coverage.py 来获取我的 Django 单元测试的覆盖率数据,但我不知道如何在 Django 调试服务器上运行这个覆盖率工具。我想用以下命令来启动 Django 服务器:

coverage -x manage.py runserver 0.0.0.0:8080

当我停止这个服务器时,我希望能得到覆盖率数据,以便生成覆盖率报告。但是当我用 CTRL-c 关闭服务器时,我看到的提示是:

^C Coverage.py 警告:没有收集到数据。

如果使用这个 coverage.py 脚本不行,我愿意尝试其他工具。

更新:

使用 --noreload 选项似乎可以正常工作,但在生成 HTML 覆盖率报告时,我遇到了以下错误信息:

traceback (most recent call last):
  File "/usr/local/bin/coverage", line 8, in <module>
    load_entry_point('coverage==3.5.1', 'console_scripts', 'coverage')()
  File "/usr/local/lib/python2.6/dist-packages/coverage/cmdline.py", line 657, in main
    status = CoverageScript().command_line(argv)
  File "/usr/local/lib/python2.6/dist-packages/coverage/cmdline.py", line 549, in command_line
    directory=options.directory, **report_args)
  File "/usr/local/lib/python2.6/dist-packages/coverage/control.py", line 599, in html_report
    reporter.report(morfs, config=self.config)
  File "/usr/local/lib/python2.6/dist-packages/coverage/html.py", line 83, in report
    self.report_files(self.html_file, morfs, config, config.html_dir)
  File "/usr/local/lib/python2.6/dist-packages/coverage/report.py", line 86, in report_files
    report_fn(cu, self.coverage._analyze(cu))
  File "/usr/local/lib/python2.6/dist-packages/coverage/html.py", line 198, in html_file
    self.write_html(html_path, html)
  File "/usr/local/lib/python2.6/dist-packages/coverage/html.py", line 103, in write_html
    write_encoded(fname, html, 'ascii', 'xmlcharrefreplace')
  File "/usr/local/lib/python2.6/dist-packages/coverage/backward.py", line 137, in write_encoded
    f.write(text.decode('utf8'))
  File "/usr/lib/python2.6/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xdf in position 59130: invalid continuation byte

1 个回答

3

嗯,我不太确定该怎么理解这个。当我创建一个全新的Django项目时,我会得到一些代码覆盖率的测量结果:

$ django-admin.py startproject mysite
$ cd mysite
$ coverage run manage.py runserver
Validating models...

0 errors found
Django version 1.3, using settings 'mysite.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
^C
$ coverage report
Name       Stmts   Miss  Cover
------------------------------
__init__       0      0   100%
manage        11      4    64%
settings      24      0   100%
------------------------------
TOTAL         35      4    89%

你用的是什么操作系统、Django版本和覆盖率工具的版本?还有你项目里有没有其他特别的地方?

单独测量runserver可能不是你想要的结果,你可能只是在测量监视文件变化并重新启动服务器的那部分代码。使用支持覆盖率的Django测试工具可能更适合你的需求。

更新:

使用--noreload这个选项可以让覆盖率工具测量你所有的代码。

撰写回答