通过使用 Nose 测试和coverage模块,我希望代码的覆盖率报告能够反射(reflect)出正在测试的版本。考虑以下代码:

import sys
if sys.version_info < (3,3):
    print('older version of python')

当我在python 3.5版中进行测试时,print()显示为未经测试。我希望覆盖范围忽略该行,但仅当我使用python 3.3+版本进行测试时

是否只有在# pragma: no cover不小于print()的情况下,才可以对sys.version_info语句执行类似(3,3)的操作?实际上,我想做这样的事情:
import sys
if sys.version_info < (3,3):
    print('older version of python') # pragma: [py26,py27,py32] no cover

最佳答案

正如您在评论中解释的那样,您所担心的是,覆盖率报告将仅显示行号,并且您希望避免一次又一次地重新检查这些行号。

另一方面,我不太赞成使用注释使代码困惑,以使一个工具或另一个工具感到满意:对我而言,这一切都是在降低可读性。因此,我想提出另一种方法,该方法可以避免代码困惑,但仍可以减轻您的负担,可以始终进行重新检查。

这个想法是创建覆盖范围状况的基线,您可以将其与将来的覆盖范围分析结果进行比较。例如,coverage.py的coverage报告如下所示(引自http://coverage.readthedocs.org/en/coverage-4.0.3/index.html):

Name                      Stmts   Miss  Cover   Missing
-------------------------------------------------------
my_program.py                20      4    80%   33-35, 39
my_other_module.py           56      6    89%   17-23
-------------------------------------------------------
TOTAL                        76     10    87%

此输出可用作“基准”的基础:粗略的想法(有关改进,请参见下文)是将输出存储为“可接受的”承保范围情况,并将其与将来的承保范围报告进行比较。不幸的是,每当行号更改时,您在比较报表时都会看到差异。为了避免这种情况,可以改进此基本思想:

借助简单的脚本,您可以转换报告,以便显示行的内容而不是行号。例如,基于您上面的代码示例的假设报告可能如下所示:
Name                      Stmts   Miss  Cover   Missing
-------------------------------------------------------
my_program.py                20      1     5%   3

从此报告中,您可以为> = 3.3的python版本创建以下“覆盖基线”,例如在文件coverage-baseline-33andabove.txt中:
my_program.py:
-    print('older version of python')

即使您在文件顶部添加了其他导入行,该基准线也看起来相同。将为您确定覆盖率的其他python版本创建更多基准文件。

可能的进一步改进可能是将行的组分开,例如:
my_program.py:
*
-    print('older version of python')
*
-    cleanup()
-    assert False
my_program2.py:
*
-    print('older version of python')

仅当未覆盖的代码发生更改(添加,删除,修改,移动)以及文件名更改时,您才会看到差异。然后,差异的发生将需要您存储新的“coverage-baseline”,或者添加更多测试,直到再次达到原始基准内容。

关于python - python coverage模块能否在单元测试中有条件地忽略行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35513257/

10-12 04:08