2017-02-22 148 views
0

免责声明;初学者问题!代码覆盖率报告“代码运行”,但不是由单独文件单元测试“代码覆盖”

我的项目结构,高度简化的问题的缘故,看起来是这样的:

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

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

$覆盖运行main.py(显示我的打印/从脚本登录)

$覆盖报告main.py

名称,撑条,小姐,覆盖

main.py,114,28,75%

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

于是,我同我的测试脚本:

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

$覆盖报告test_main.py

名称,撑条,小姐,封面

test_main.py,8,0,100%

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

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


在我的Ubuntu机器上运行的“覆盖运行test_main.py;覆盖报告”不仅使我对test_main.py的报告。在我的Windows机器这给:

名称,支杆,小姐,封面


main.py,114,74,35%

test_main。PY,8,0,100%


TOTAL,122,74,39%

覆盖报告仍然没有意义:

  1. 的test_main涵盖9出的134行代码和主要覆盖范围内的10个函数中的1个不是35%
  2. 为什么它报告test_main的覆盖率,这些是测试,如果这不是100%,它会很奇怪,因为我' m运行所有测试以查看我的cov erage ...
  3. 我在这里做错了什么,或者看着它的这种方式是bollocks,计算平均“覆盖率”,而总结与代码本身的测试提供没有见解,在我的初学者意见是错误的
+0

没有看到您的代码很难回答。所有的coverage.py都可以告诉你你运行的是什么代码,以及你可以运行什么代码,并告诉你它们的区别。你已经展示了两份报告,这两份报告都声称是关于main.py的,但第一份报告中有114份报告,第二份报告说有8份报告。这不应该改变。你能仔细检查细节吗? –

+0

@NedBatchelder对不起,小错 - 底部报告与test_main.py相关。我仍然不明白在* test *上下文中覆盖是如何有用的,它在检查哪些代码可能永远不会运行或其他用途上看起来很有用。 我想通过单元测试了解我的代码的哪些部分被*覆盖*(因此覆盖率我认为...),但这只是向我展示了在两个单独的报告中运行的代码。因此,我可以用coverage.py完成我想要的唯一方法是复制test_main.py中的所有main.py代码并在脚本中进行测试? – MarcelTon

+0

您可以使用coverage.py来衡量您的测试套件的执行情况。它会告诉你产品代码中的哪些行是运行的,哪些不是。做到这一点:“覆盖运行test_main.py;覆盖报告”。如果您不想将报告限制为只有一个文件,则不要将报告名称放在报告报告上。 –

回答

0

要回答和关闭我自己的问题 - 尽管我仍然不太同意一些覆盖逻辑,但35%是准确的,谢谢@Ned指出仅当导入时才会计算行数。它还包含顶级文件描述,argparser和主要引用达到此百分比的函数。在114行代码中,总共可以有40个 - 即使我直接导入的函数本身只是代码行。

我不太喜欢这种报告方式,因为我没有在测试语句中使用所有的输入,argparser没有受到影响,仍然说它们被“覆盖” - 主要是导致语义讨论,我会说这些是“看到”或“通过”,但实际上没有“被测试覆盖”。

我还做了另一个测试覆盖率运行与不同的文件名test_main_2.py测试以完全相同的方式相同的功能...产生了(35 + 100 + 100)/ 3 = 78%的覆盖率平均,而不是之前(35 + 100)/ 2 = 68%的覆盖率。

我明白它是如何计算覆盖面(平均),现在让我以更正确的方式解释数字。也许这可以帮助初学者解释他或她自己的第一个结果。