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

Python Django测试覆盖率与代码覆盖率,python,django,unit-testing,code-coverage,django-nose,Python,Django,Unit Testing,Code Coverage,Django Nose,我已成功安装并配置了 问题是,如果我只运行/manage.py shell的覆盖率,然后退出该shell,它会显示37%的代码覆盖率。我完全理解执行代码并不意味着测试代码。我唯一的问题是,现在怎么办 我所设想的是能够导入所有python模块并在执行任何测试之前“安定下来”,并直接与coverage通信,说“好,开始计算到达的代码。” 理想情况下,这可以通过nose基本上在执行每个测试套件之前重置“接触”的代码行来实现 我不知道从哪里开始寻找/开发。我在网上搜索过,没有发现任何有成果的东西。如有任

我已成功安装并配置了

问题是,如果我只运行
/manage.py shell的覆盖率,然后退出该shell,它会显示37%的代码覆盖率。我完全理解执行代码并不意味着测试代码。我唯一的问题是,现在怎么办

我所设想的是能够导入所有python模块并在执行任何测试之前“安定下来”,并直接与
coverage
通信,说“好,开始计算到达的代码。”

理想情况下,这可以通过
nose
基本上在执行每个测试套件之前重置“接触”的代码行来实现

我不知道从哪里开始寻找/开发。我在网上搜索过,没有发现任何有成果的东西。如有任何帮助/指导,将不胜感激

附言

我试着执行这样的操作:

DJANGO_SETTINGS_MODULE=app.settings_dev coverage run app/tests/gme_test.py
./manage.py test myapp --with-coverage
coverage run --source=myapp,anotherapp ---omit=*/migrations/* ./manage.py test
它确实有效(覆盖率为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

我对你在这里想要达到的目标有点困惑

Django的测试在这里有很好的介绍:

你在你的应用程序中以test.py的形式编写测试——我不认为有必要使用nose,因为标准的django方法非常简单

然后以覆盖率运行方式运行它们。/manage.py test main
-其中“main”是您的应用程序

按照此处的说明指定代码的源文件:以便只计算代码

e、 g.覆盖率运行——source=main./manage.py test main

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

可以通过覆盖模块的API执行“确定,开始计算到达的代码”。你可以通过外壳来检查这个。直接从:


<>你可以让你自己的测试运行者来完成这项工作,以满足你的需要(有些人会考虑从任何单元测试中得到的覆盖范围是好的,而其他人只会接受一个单元对该单元的测试所覆盖的范围)。

< P>因为你使用Django鼻子,你有两个关于如何运行覆盖的选项。DaveB已经指出了第一个问题:

coverage run ./manage.py test myapp
上面的代码实际上运行覆盖率,然后它监视由test命令执行的所有代码

但是,django nose包()中默认包含一个nose coverage插件。您可以这样使用它:

DJANGO_SETTINGS_MODULE=app.settings_dev coverage run app/tests/gme_test.py
./manage.py test myapp --with-coverage
coverage run --source=myapp,anotherapp ---omit=*/migrations/* ./manage.py test
(还有一些附加选项,如应涵盖哪些模块,是否包含html报告等。这些都记录在上面的链接中-您还可以键入
/manage.py test--help
,以获取一些快速信息)

运行nose coverage插件将导致coverage在执行django引导代码后运行,因此相应的代码不会被报告为已覆盖

当以原始方式运行coverage时,您看到的大多数代码都报告为coverage,它们是导入语句、类定义、类成员等。当python在导入期间对它们进行求值时,coverage自然会将它们标记为covered。但是,运行nose插件不会报告所涵盖的引导代码,因为测试运行程序在django环境加载后启动。当然,这样做的一个副作用是,您永远无法实现100%的覆盖率(…或close:),因为您的全局范围语句永远无法覆盖

在来回切换并使用覆盖率选项后,我现在使用的覆盖率如下:

DJANGO_SETTINGS_MODULE=app.settings_dev coverage run app/tests/gme_test.py
./manage.py test myapp --with-coverage
coverage run --source=myapp,anotherapp ---omit=*/migrations/* ./manage.py test

因此,a)coverage报告所涵盖的导入语句、类成员定义等(事实上,这是事实-此代码已成功导入和解释),b)它将只涵盖我的代码,而不包括django代码或我使用的任何其他第三方应用程序;覆盖率将反映我的项目被覆盖的程度。希望这有帮助

我也有同样的问题。我通过创建一个.coveragerc文件来节省一些时间,该文件指定了与悬赏奖励答案中列出的选项类似的选项

现在运行“coverage run manage.py test”和“coverage report-m”将显示覆盖率报告和未覆盖的行


(有关.coveragerc文件:)的详细信息,请参见此处。

Nose速度更快,更灵活。事实上,这不是核心问题。你的最后一句话正是我开始悬赏的原因。“你仍然会得到一定的百分比标记为覆盖”——这是一个大问题!正如我所指出的,在我的例子中,这个“特定百分比”是37%,包括但未测试的代码。我不同意。覆盖工具永远无法保证您的任何代码都经过了正确的测试。这只能通过在了解系统所有部分的情况下仔细设计测试来实现。覆盖率仅仅有助于突出测试中的漏洞。每个人对此怎么看?这是一个非常糟糕的“帮助突出显示孔”,因为它没有突出显示所有的孔!这就像说“哦,这是计算机科学中不起作用的一部分”这很古老,但值得注意的是,我们都同意这一点,因为覆盖率工具无法判断您是否测试了代码(只是运行了几行代码)。如果它可以告诉你所有的测试都很好,它也可以为你编写代码。。。最终,你写的字符告诉处理器该做什么,你也需要为测试做同样的事情。这是否意味着我必须编写自己的覆盖率运行程序?目前,如果您说“…调用您的代码…”的部分包含一个
import
语句,那么该代码也将被视为包含在内。您是否发现现有的运行程序足够取决于您。我只是建议,如果你有特殊需要,你可能需要自己写<代码>覆盖率.py跟踪执行的代码,