通过使用 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/