无法在 nose2 中获取缺失的线条和分支

Unable to get missing lines & branches in nose2

我正在尝试让我的测试报告缺失的行和分支。我已经配置了 nose2 和 coverage 以生成线路和分支覆盖,据我所知,我已经正确设置了覆盖配置以提供缺失的线路和分支。但是,当 运行 在 nose2 下时,我无法获得覆盖以给我缺少的列,但如果我直接 运行 就可以。


考虑在我的项目目录中进行以下设置。

my_module/
    __init__.py
    main.py
tests/
    test_a_thing.py
unittest.cfg
.coveragerc

.coveragerc 的内容

[run]
branch = True

[report]
show_missing = True

unittest.cfg

的内容
[coverage]
always-on = True
coverage = my_module
coverage-config = .coveragerc

我的 nose2 命令的输出

(example_venv) andy@batman[11:30:53]:/space/test_example$ python -m nose2 -c unittest.cfg --no-user-config
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK
----------- coverage: platform linux, python 3.5.2-final-0 -----------
Name                    Stmts   Miss Branch BrPart  Cover
---------------------------------------------------------
my_module/__init__.py       0      0      0      0   100%
my_module/main.py           4      1      2      1    67%
---------------------------------------------------------
TOTAL                       4      1      2      1    67%

正如你所看到的,它给了我Branch封面,但没有告诉我缺少的分支。

如果我只是运行 coverage report(在运行宁鼻子后留下的生成的.coverage文件上)

(example_venv) andy@batman[11:34:15]:/space/test_example$ coverage report
Name                    Stmts   Miss Branch BrPart  Cover   Missing
-------------------------------------------------------------------
my_module/__init__.py       0      0      0      0   100%
my_module/main.py           4      1      2      1    67%   3, 2->3
-------------------------------------------------------------------
TOTAL                       4      1      2      1    67%

你可以看到覆盖给了我缺失的分支。


我可以看出 coveragenose2 下 运行 时拾取 .coveragerc,因为如果我删除 branch = True 下的行 [ .coveragerc 中的 =23=] 部分,然后当 nose 下的 运行 时,分支覆盖统计数据从报告中消失。


我是否遗漏了一些我应该做的额外的事情来让这个 show_missing 配置在 nose2 下 运行 时传递给 coverage

安装的版本

cov-core==1.15.0
coverage==4.3.4
nose2==0.6.5

tl;dr - 必须为 nose2 添加 coverage-report = term-missingunittest.cfg(或其他 --config [CONFIG], -c [CONFIG] 文件)的 [coverage] 部分。为了 Cov-Coreshow_missing = True 传递给 coverage


更长的解释:

当 command-line 上的 运行 coverage report 时,show_missing 将作为 None 传递到 coverage.coverage()* 中,除非在命令行中被覆盖参数。

然而 nose2 使用 cov-core,它将 show_missing 传递给 cov_core.CovController.summary() 中的 coverage.coverage()* 作为 TrueFalse.基于以下逻辑:

if 'term' in self.cov_report or 'term-missing' in self.cov_report:
    show_missing = 'term-missing' in self.cov_report
    self.cov.report(show_missing=show_missing, ignore_errors=True, file=stream)

cov_report 是在 nose2.

中设置的 coverage-report 配置

所以这是我的困惑,因为我试图使用 coverage 的配置来产生缺失的 lines/branches(在做学期报告时,show_missing 有一个额外的标志),当 Cov-Core 将它们视为单独的报告时(报告 term 以获得普通覆盖,或 term-missing 获得普通覆盖 + 缺失行)。

所以不要让自己被这种覆盖行为所困扰 Cov-Core 已经决定覆盖,而大多数其他位(include/exclude 一个分支覆盖)仍然由 coverage的配置。


*coverage.coverage() 是向后兼容性调整,实际上是 coverage.control.Coverage()[=59 的导入(在 coverage/__init__.py 中) =]