使用Django调试服务器进行代码覆盖率测试

3

我正在使用来自http://nedbatchelder.com/code/coverage/的coverage.py获取我的Django单元测试的覆盖数据,但是我似乎无法弄清楚如何在django调试服务器上运行覆盖。我想要使用以下命令运行django服务器:

coverage -x manage.py runserver 0.0.0.0:8080

当停止该服务器时,我应该使用覆盖率数据来生成覆盖率报告。但是,在使用CTRL-c关闭服务器时,我会收到以下警告信息:

^CCoverage.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和coverage版本等信息?您的项目中还有其他不寻常的地方吗?

仅测量runserver可能不是您想要的,您可能只想测量监视文件更改并重新启动服务器的代码。带有覆盖支持的Django测试运行程序可能更适合您的需求。

更新:

提供--noreload开关可以使覆盖度测量所有您的代码。


我项目中没有任何异常。我使用的版本是:Ubuntu 10.10、django 1.3、coverage 3.5。 - Divick
我发现当我的.coveragerc中包含= */views.py时,它无法收集数据。如果我删除此行,则可以收集到数据,但代码的覆盖率显示为0%(我的.coveragerc具有source = .)。如果我删除source = .设置,则在我的项目中看不到应用程序内存在的文件名称。我之所以希望在没有单元测试的情况下收集数据,是因为使用单元测试的覆盖范围仅告诉您测试的覆盖统计信息,这有点人为,并不能告诉您某个用户交互的实际场景下的覆盖范围。 - Divick
我会先不使用任何包含或源指令来运行它,以便全面了解正在被测量的内容。 - Ned Batchelder
我尝试运行它而不使用指令,但我发现它不会报告应用程序目录中代码的覆盖率统计,除了每个应用程序中的__init__文件。此外,它还报告了django模块的覆盖率统计,这真的混淆了我的项目报告,因此有点烦人。 - Divick
是的,我并不建议你总是以这种方式运行它,只是想找出问题所在。 - Ned Batchelder
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接