代码覆盖率报告 "code run",但不是 "code covered" 通过单独的文件单元测试
Code coverage reporting "code run", but not "code covered" by separate-file unit tests
免责声明;初学者问题!
我的项目结构,为了这个问题而高度简化,如下所示:
Project/
|-- main.py
|-- test_main.py
阅读 Jeff Knupp's blogpost on unit testing 并编写了各种测试后,我想看看我的代码现在有多少被测试覆盖了。所以我安装了 coverage.py,下面的内容让我很困惑:
$ coverage run main.py (shows me the prints/logging from the script)
$ coverage report main.py
Name, Stmts, Miss, Cover
main.py, 114, 28, 75%
问题是,我没有 运行 在主脚本中进行单元测试,我也不认为我应该这样做。在提交之前,我手动 运行 来自 test_main.py 的所有测试,并且知道它们 而不是 涵盖了我所有陈述的 75%。阅读 coverage documentation 后,我怀疑我的单元测试实施...我是否需要来自 运行 测试的 main.py 的触发器?
所以我在我的测试脚本上尝试了同样的方法:
$ coverage run test_main.py (shows me an 'OK' test run for all tests)
$ coverage report test_main.py
Name, Stmts, Miss, Cover
test_main.py, 8, 0, 100%
但这只是告诉我,在执行该脚本期间,我已经“命中”了测试语句中 100% 的代码。那么,如果 "increase test coverage" 只是显示已使用的代码,那么为什么要在 "increase test coverage" 下列出覆盖范围。
我真的很想看看我的 main.py 有多少被 test_main.py 覆盖了,我很确定我错过了一些基本概念。有人可以详细说明吗?
在我的 Ubuntu 机器上 运行ning “coverage 运行 test_main.py; coverage report”只给我一份关于 test_main.py 的报告。在我的 Windows 机器上,这给出了:
Name, Stmts, Miss, Cover
main.py, 114, 74, 35%
test_main.py, 8, 0, 100%
TOTAL, 122, 74, 39%
覆盖率报告仍然没有意义:
- test_main 覆盖了 134 行代码中的 9 行和 main 中 10 个函数中的 1 行 - 覆盖率不到 35%
- 为什么要报告 test_main 的覆盖率,这些是测试,如果这不是 100% 会很奇怪,因为我正在 运行 进行所有测试以查看我的覆盖率...
- 我在这里做错了什么,或者这种看待它的方式是胡说八道,计算“覆盖率”的平均值,同时用代码本身对测试求和没有提供任何见解,在我的初学者看来是错误的
回答并结束我自己的问题 - 尽管我仍然不同意相当多的覆盖率逻辑,但 35% 是准确的,感谢 @Ned 指出仅导入时就计算行数。它还包括顶级文件描述、argparser 和导致此百分比的函数的主要引用。总共 114 行代码中有 40 行 - 即使我直接导入的函数本身只有 9 行代码。
我不太喜欢这种报告方式,因为我没有在测试语句中使用所有导入,argparser 未受影响,但它仍然说这些是 "covered" - 主要导致语义讨论,我会说这些是 "seen" 或 "passed",但实际上不是 "covered by tests"。
我还做了另一个测试覆盖 运行 只有 一个不同的文件名 test_main_2.py
以完全相同的方式测试相同的功能...导致a (35+100+100)/3 = 78% 的平均覆盖率,而不是之前的 (35+100)/2 = 68% 的覆盖率。
但是 我确实理解它如何计算覆盖率(平均),现在允许我以更正确的方式解释数字。也许这可以帮助早期初学者解释他或她自己的第一个结果。
免责声明;初学者问题!
我的项目结构,为了这个问题而高度简化,如下所示:
Project/
|-- main.py
|-- test_main.py
阅读 Jeff Knupp's blogpost on unit testing 并编写了各种测试后,我想看看我的代码现在有多少被测试覆盖了。所以我安装了 coverage.py,下面的内容让我很困惑:
$ coverage run main.py (shows me the prints/logging from the script)
$ coverage report main.py
Name, Stmts, Miss, Cover
main.py, 114, 28, 75%
问题是,我没有 运行 在主脚本中进行单元测试,我也不认为我应该这样做。在提交之前,我手动 运行 来自 test_main.py 的所有测试,并且知道它们 而不是 涵盖了我所有陈述的 75%。阅读 coverage documentation 后,我怀疑我的单元测试实施...我是否需要来自 运行 测试的 main.py 的触发器?
所以我在我的测试脚本上尝试了同样的方法:
$ coverage run test_main.py (shows me an 'OK' test run for all tests)
$ coverage report test_main.py
Name, Stmts, Miss, Cover
test_main.py, 8, 0, 100%
但这只是告诉我,在执行该脚本期间,我已经“命中”了测试语句中 100% 的代码。那么,如果 "increase test coverage" 只是显示已使用的代码,那么为什么要在 "increase test coverage" 下列出覆盖范围。
我真的很想看看我的 main.py 有多少被 test_main.py 覆盖了,我很确定我错过了一些基本概念。有人可以详细说明吗?
在我的 Ubuntu 机器上 运行ning “coverage 运行 test_main.py; coverage report”只给我一份关于 test_main.py 的报告。在我的 Windows 机器上,这给出了:
Name, Stmts, Miss, Cover
main.py, 114, 74, 35%
test_main.py, 8, 0, 100%
TOTAL, 122, 74, 39%
覆盖率报告仍然没有意义:
- test_main 覆盖了 134 行代码中的 9 行和 main 中 10 个函数中的 1 行 - 覆盖率不到 35%
- 为什么要报告 test_main 的覆盖率,这些是测试,如果这不是 100% 会很奇怪,因为我正在 运行 进行所有测试以查看我的覆盖率...
- 我在这里做错了什么,或者这种看待它的方式是胡说八道,计算“覆盖率”的平均值,同时用代码本身对测试求和没有提供任何见解,在我的初学者看来是错误的
回答并结束我自己的问题 - 尽管我仍然不同意相当多的覆盖率逻辑,但 35% 是准确的,感谢 @Ned 指出仅导入时就计算行数。它还包括顶级文件描述、argparser 和导致此百分比的函数的主要引用。总共 114 行代码中有 40 行 - 即使我直接导入的函数本身只有 9 行代码。
我不太喜欢这种报告方式,因为我没有在测试语句中使用所有导入,argparser 未受影响,但它仍然说这些是 "covered" - 主要导致语义讨论,我会说这些是 "seen" 或 "passed",但实际上不是 "covered by tests"。
我还做了另一个测试覆盖 运行 只有 一个不同的文件名 test_main_2.py
以完全相同的方式测试相同的功能...导致a (35+100+100)/3 = 78% 的平均覆盖率,而不是之前的 (35+100)/2 = 68% 的覆盖率。
但是 我确实理解它如何计算覆盖率(平均),现在允许我以更正确的方式解释数字。也许这可以帮助早期初学者解释他或她自己的第一个结果。