我已使用django-nose
coverage
问题是,如果我只是为./manage.py shell
运行覆盖并退出该shell,它会显示37%的代码覆盖率。我完全理解执行的代码并不代表测试的代码。我唯一的问题是 - 现在怎么办?
我想象的是能够导入所有的python模块和#34;安定下来"在执行任何测试之前,直接与coverage
通信说"好的,在这里开始计算到达的代码。"
理想情况下,这可以通过nose
基本上重置"触及"来完成。在执行每个测试套件之前的代码行。
我不知道从哪里开始寻找/开发。我在网上搜索过,并没有发现任何有成效的东西。任何帮助/指导都将不胜感激。
P.S。
我尝试执行这样的事情:
DJANGO_SETTINGS_MODULE=app.settings_dev coverage run app/tests/gme_test.py
它有效(显示1%的覆盖率),但我无法弄清楚如何为整个应用程序执行此操作
修改:这是我的覆盖配置:
[run]
source = .
branch = False
timid = True
[report]
show_missing = False
include = *.py
omit =
tests.py
*_test.py
*_tests.py
*/site-packages/*
*/migrations/*
[html]
title = Code Coverage
directory = local_coverage_report
答案 0 :(得分:28)
因为你使用django-nose,你有两个选项来运行覆盖。 DaveB已经指出了第一个问题:
coverage run ./manage.py test myapp
以上实际上运行覆盖,然后监视测试命令执行的所有代码。
但是,django-nose包(http://nose.readthedocs.org/en/latest/plugins/cover.html)中默认包含一个鼻子覆盖插件。您可以像这样使用它:
./manage.py test myapp --with-coverage
(还有一些其他选项,例如应该涵盖哪些模块,是否包含html报告等。这些都记录在上面的链接中 - 您也可以输入./manage.py test --help
以获取一些快速信息)
运行nose coverage插件将导致在执行django引导代码后运行覆盖率,因此相应的代码将不会被报告为已覆盖。
您在原始方式运行coverage时报告的大部分代码都是导入语句,类定义,类成员等等。当python在导入时评估它们时,coverage会自然地将它们标记为已覆盖。但是,运行nose插件不会报告引导代码,因为在加载django环境后测试运行器启动。当然,这样做的副作用是你永远无法实现100%覆盖率(...或关闭:)),因为你的全局范围陈述永远不会被覆盖。
在来回切换并使用覆盖选项后,我现在最终使用了这样的覆盖:
coverage run --source=myapp,anotherapp ---omit=*/migrations/* ./manage.py test
这样a)覆盖将报告导入语句,类成员定义等(实际上是事实 - 这段代码已成功导入和解释)和b)它只会覆盖我的代码而不是django代码,或我使用的任何其他第三方应用程序;覆盖率将反映我的项目的覆盖范围。希望这有帮助!
答案 1 :(得分:3)
“好的,开始计算到达代码了。”可以通过coverage模块的API完成。你可以通过shell检查出来。直接从http://nedbatchelder.com/code/coverage/api.html偷走:
import coverage
cov = coverage.coverage()
cov.start()
# .. call your code ..
cov.stop()
cov.save()
cov.html_report()
您可以让自己的测试运行者完全按照您的需求进行操作(有些人会考虑从任何单元测试中获得的覆盖率都可以,而其他人只会接受由单元测试引起的单元覆盖该单位。)
答案 2 :(得分:3)
我有同样的问题。我通过创建一个.coveragerc文件来节省一些时间,该文件指定的选项类似于获得赏金的答案中列出的选项。
现在运行'覆盖运行manage.py test'然后是'覆盖率报告-m'将向我显示覆盖率报告和未涵盖的行。
(有关.coveragerc文件的详细信息,请参见此处:http://nedbatchelder.com/code/coverage/config.html)
答案 3 :(得分:1)
我对你在这里想要达到的目标感到有点困惑。
Django中的测试非常清楚:https://docs.djangoproject.com/en/dev/topics/testing/overview/
您在应用中将测试编写为test.py - 我没有看到鼻子的需要,因为标准的django方式非常简单。
然后将其作为coverage run ./manage.py test main
运行 - 其中' main'是你的应用
指定代码的源文件,如下所示:http://nedbatchelder.com/code/coverage/cmd.html,以便只计算您的代码
e.g。覆盖运行--source = main ./manage.py test main
作为示例,您仍然会获得标记为包含简单测试的特定百分比。这是因为执行部分代码是为了启动服务器,例如模块中的定义等。