Django测试覆盖率与代码覆盖率

时间:2014-03-29 03:00:55

标签: python django unit-testing code-coverage django-nose

我已使用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

4 个答案:

答案 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

作为示例,您仍然会获得标记为包含简单测试的特定百分比。这是因为执行部分代码是为了启动服务器,例如模块中的定义等。