代码覆盖率报告“代码运行”,但不是单独文件单元测试的“代码覆盖”

时间:2017-02-22 12:00:48

标签: python-2.7 unit-testing coverage.py

声明;初学者问题!

我的项目结构,为了问题而高度简化,看起来像这样:

Project/
|-- main.py
|-- test_main.py

在阅读Jeff Knupp's blogpost on unit testing并编写各种测试之后,我想看看我的代码现在有多少是由测试覆盖的。所以我安装了coverage.py,以下让我感到困惑:

  

$ coverage运行main.py(显示脚本中的打印/日志记录)

     

$ coverage报告main.py

     

姓名,Stmts,Miss,Cover

     

main.py,114,28,75%

问题是,我没有在主脚本中运行单元测试,也不认为我应该这样做。我在提交之前手动运行test_main.py中的所有测试,并知道他们覆盖了我所有语句的75%。阅读coverage documentation后,我怀疑我的单元测试实现......我是否需要运行测试的main.py中的触发器?

所以我在我的测试脚本上尝试了同样的事情:

  

$ coverage运行test_main.py(显示所有测试的'OK'测试运行)

     

$ coverage报告test_main.py

     

姓名,Stmts,Miss,Cover

     

test_main.py,8,0,100%

但这只是告诉我在执行该脚本期间我在测试语句中“击中”了100%的代码。那么为什么然后覆盖"increase test coverage"下的覆盖范围,如果它只显示已使用的代码。

我真的很想看看我的main.py有多少被test_main.py覆盖,我很确定我错过了一些基本概念。有人可以详细说明吗?

在我的Ubuntu机器上运行“coverage run test_main.py;覆盖率报告”只给我一个关于test_main.py的报告。在我的Windows机器上,这给出了:

  

姓名,Stmts,Miss,Cover

           

main.py,114,74,35%

     

test_main.py,8,0,100%

           

TOTAL,122,74,39%

报道报告仍然没有意义:

  1. test_main覆盖134行代码中的9行,主要覆盖10个函数中的1个 - 覆盖率不是35%
  2. 为什么报告test_main的覆盖范围,这些是测试,如果这不是100%,那将是奇怪的,因为我正在运行所有测试以查看我的覆盖...
  3. 我在这里做错了,或者这种看待它的方式是bollocks,计算平均值“覆盖率”,而用代码本身总结测试没有提供任何见解,而且在初学者看来是错误的

1 个答案:

答案 0 :(得分:0)

回答并结束我自己的问题 - 即使我仍然不同意一些覆盖逻辑,35%是准确的,并且感谢@Ned指出仅在导入时计算行数。它还包括顶级文件描述,argparser和导致此百分比的函数的主要参考。在114行代码中总共有40行 - 即使我直接导入的函数本身只有 9 代码行。

我不太喜欢这种报道方式,因为我没有在测试声明中使用所有导入,因此argparser没有受到影响,但仍然表示这些是"覆盖" - 主要是导致语义讨论,我会说这些是"看到"或者"通过",但实际上并没有#34;被测试"覆盖。

我还使用以不同的文件名test_main_2.py运行另一个测试覆盖率,以完全相同的方式测试相同的函数...导致(35 + 100 + 100)/ 3 =平均覆盖率为78%而不是之前(35 + 100)/ 2 = 68%覆盖率。

但是我确实理解它如何计算覆盖率(平均值)现在允许我以更正确的方式解释数字。也许这可以帮助早期初学者解释他或她自己的第一个结果。