浅谈coverage

article/2025/10/23 11:54:04

背景描述

公司需要对测试用例的对工程代码的覆盖率做统计,因此需要用到coverage,这里有个特殊的点,公司的工程运行时要在容器中进行的。

实际应用

1. 首先,需要下载coverage: pip3 install coverage

2. 然后,由于工程是个django项目,所以需要在根目录创建一个配置文件:.coveragerc 文件。

这里我们简单介绍下这个 .coveragerc 文件

Coverage 支持很多配置选项,为了方便,通常将这些配置写在名为 .coveragerc 的文件中, Coverage 运行时会从项目根目录读取这个配置文件。

3. 接下来,就是配置这个 .coveragerc 文件。      

    基本的配置:

[run]
branch = True
source = .

[report]
show_missing = False

    Coverage 的配置遵循 ini 文件语法。简单来说就是,[section] 代表一个配置块,用于组织相关的一组配置。例如这里 [run] 是一个配置块,[report] 是另一个配置块,两个块下都有相关的一些配置项。

   配置项的格式为 key = value 。

   这几个简单配置项的含义为:

  • branch = True 是否统计条件语句的分支覆盖情况。if 条件语句中的判断通常有 True 和 False 两种情况,设置 branch = True 后,Coverage 会测量这两种情况是否都被测试到。
  • source = . 指定需统计的源代码目录,这里设置为当前目录(即项目根目录)。
  • show_missing = True 在生成的统计报告中显示未被测试覆盖到的代码行号。

4. 然后就可以运行 coverage run your_test.py 命令了,这里需要注意,如果有多个测试文件,对同一个工程做测试的话,这里最好加上参数 -p ,即:coverage run -p your_test.py  命令,这是因为没运行一个测试,都会生成一个 .coverage文件,为了保证多个测试生成的 .coverage 文件不重名,所以就需要 -p参数。like this:

                    

当然,由于是做统计,所以在有多个测试对同一个工程做覆盖率的场景下,就最好不要弄出很多的这种 .coverage.xxxx文件,我们就需要将多个.coverage.xxxx,进行合并。这时就需要使用命令,coverage combine 命令,注意在ubantu里,如果是用pycharm打开的文件,或者是直接用terminal打开的文件,都是可以看到 .coverage.xxx文件的,但是在容器里是看不到  .coverage.xxx文件的,这里注意,虽然看不到,但不代表它不存在。like this:

 这时,我们只需要在容器里执行命令:coverage combine 即可

这样就可以把多个 .coverage.xxx  文件合并为一个文件 .coverage(注意:配置文件后面有 rc )。

5. 最后,就可以查看报告了:

  coverage report 即可

  

 这下统计的就是多个测试对同一个工程的总体覆盖率,由于存在同一段代码被多个测试所覆盖的这种场景,所以这个合并后的总覆盖率会小于各个测试覆盖率的和。简单来说,我这里有2个测试,一个总覆盖率是 15% 一个是 8%, 加起来为 23% ,但合并后的总覆盖率却为19%。

ok,到这里,我的任务就完成了。

但是,这里的而局限性很大,而且在后来的代码审视过程中,被发现是有问题的。因为涉及的好多文件的覆盖率是 0%,这不正常。

后来我将  .coveragerc 文件做了些变更:

改为这样:

或者:

结果都是,只有test.py本身和直接被其调用的文件的覆盖率:

这显然是不符合我的预期的。由于我的工程是个web项目,test中经常是通过http访问web服务,来检测服务是否正常,同时通过访问服务返回的数据判断是否符合预期。这样一来,通过目前的方式,就肯定无法统计web服务中有那些文件被访问了,哪些又没test到。 

基于,这个问题,最后我找到了解决方法(还是从其他工程的测试命令中倒腾出来的)哎....

在新的方式中, .coveragerc 文件,依旧使用最开始的设置。

然后只需要在工程根目录下执行 coverage 命令就行。

coverage run -p manage.py test test_file_path      即可

其中 -p 参数,上述文中有介绍,用于区分多个测试文件的覆盖率报告

test_file_path  参数是指要跑的测试文件所在的文件夹(该命令会将文件夹中所有的test文件都执行一遍)

其它参数为固定模式无需改动。

看看实际执行:

现在再看,是不是就对了,同时也证明了之前的做法不对,有问题。 

另外,在已经有报告的情况下,想转html报告,执行命令:coverage html 即可。

好吧.....我又补充来了......

其实,对coverage最全面的用法,还是得看说明文档。。。。网上基本没有很全的介绍。。。。真的上头啊。。。。今天遇到个要coverage的,目标是在一堆文件中,只需个别文件的覆盖率报告。。。好吧,上面的方法就全部宣布,拜拜了。。。

直接在客户端,输入 coverage --help 查看下命令呗,到底这能干啥,全在这里了:

(py3_10env) ymengkai@ubuntu:~/p4/scm_project/build$ coverage --help
Coverage.py, version 7.1.0 with C extension
Measure, collect, and report on code coverage in Python programs.usage: coverage <command> [options] [args]Commands:annotate    Annotate source files with execution information.combine     Combine a number of data files.debug       Display information about the internals of coverage.pyerase       Erase previously collected coverage data.help        Get help on using coverage.py.html        Create an HTML report.json        Create a JSON report of coverage results.lcov        Create an LCOV report of coverage results.report      Report coverage stats on modules.run         Run a Python program and measure code execution.xml         Create an XML report of coverage results.Use "coverage help <command>" for detailed help on any command.
Full documentation is at https://coverage.readthedocs.io

再看下,更细致的操作:

(py3_10env) ymengkai@ubuntu:~/p4/scm_project/build$ coverage run --help
Usage: coverage run [options] <pyfile> [program options]Run a Python program, measuring code execution.Options:-a, --append          Append coverage data to .coverage, otherwise it startsclean each time.--branch              Measure branch coverage in addition to statementcoverage.--concurrency=LIBS    Properly measure code using a concurrency library.Valid values are: eventlet, gevent, greenlet,multiprocessing, thread, or a comma-list of them.--context=LABEL       The context label to record for this coverage run.--data-file=OUTFILE   Write the recorded coverage data to this file.Defaults to '.coverage'. [env: COVERAGE_FILE]--include=PAT1,PAT2,...Include only files whose paths match one of thesepatterns. Accepts shell-style wildcards, which must bequoted.-m, --module          <pyfile> is an importable Python module, not a scriptpath, to be run as 'python -m' would run it.--omit=PAT1,PAT2,...  Omit files whose paths match one of these patterns.Accepts shell-style wildcards, which must be quoted.-L, --pylib           Measure coverage even inside the Python installedlibrary, which isn't done by default.-p, --parallel-mode   Append the machine name, process id and random numberto the data file name to simplify collecting data frommany processes.--source=SRC1,SRC2,...A list of directories or importable names of code tomeasure.--timid               Use a simpler but slower trace method. Try this if youget seemingly impossible results!--debug=OPTS          Debug options, separated by commas. [env:COVERAGE_DEBUG]-h, --help            Get help on this command.--rcfile=RCFILE       Specify configuration file. By default '.coveragerc','setup.cfg', 'tox.ini', and 'pyproject.toml' aretried. [env: COVERAGE_RCFILE]Full documentation is at https://coverage.readthedocs.io

我了个去,就问,全面不。。。。哎。。。。

看实际应用:

(py3_10env) ymengkai@ubuntu: coverage run -a --include "p4api/p4apiutils.py" ./p4api/tests/p4apiutils_test.py 
.....s.............ss........s......s.s.s......
----------------------------------------------------------------------
Ran 47 tests in 186.144sOK (skipped=7)
(py3_10env) ymengkai@ubuntu: coverage report
Name                  Stmts   Miss  Cover
-----------------------------------------
p4api/p4apiutils.py     646    214    67%
-----------------------------------------
TOTAL                   646    214    67%
(py3_10env) ymengkai@ubuntu: coverage run -a --include "p4api/changespec.py" p4api/tests/changespec_test.py
..................
----------------------------------------------------------------------
Ran 18 tests in 217.033sOK
(py3_10env) ymengkai@ubuntu: coverage report
Name                  Stmts   Miss  Cover
-----------------------------------------
p4api/changespec.py     462     55    88%
p4api/p4apiutils.py     646    214    67%
-----------------------------------------
TOTAL                  1108    269    76%

哎,看上去,好多了.....

参考文件:统计 Django 项目的测试覆盖率 - 知乎

                  Configuration reference — Coverage.py 6.3.2 documentation (这是官网,最全面)


http://chatgpt.dhexx.cn/article/PHGhmvb4.shtml

相关文章

Python代码覆盖率分析工具Coverage

目录 简介 安装 命令行中使用 调用API使用 简介 Coverage是一个Python代码覆盖率分析工具&#xff0c;它可以用于衡量Python测试代码的质量。通过给代码执行带来的覆盖率数据&#xff0c;Coverage可以帮助开发人员找出被回归测试代码中的漏洞&#xff0c;并且指明哪些代码…

coverage 测试代码覆盖率

测试覆盖率&#xff0c;简单的说&#xff0c;就是评价测试活动覆盖产品代码的指标。测试的目的&#xff0c;是确认产品代码按照预期一样工作&#xff0c;也可以看作是产品代码工作方式的说明文档。进一步考虑&#xff0c;测试覆盖率可以看作是产品代码质量的间接指标&#xff0…

GIS原理篇 Coverage

一、什么是 Coverage Coverage 是一种用于存储矢量数据的地理相关数据模型&#xff0c;它包含地理要素的空间&#xff08;位置&#xff09;数据和属性&#xff08;描述性&#xff09;数据。Coverage 使用一组要素类来表示地理要素。每个要素类存储一组点、线&#xff08;弧&am…

Python:代码覆盖率工具coverage

简介&#xff1a;覆盖率测量通常用于衡量测试的有效性。它可以显示您的代码的哪些部分正在被测试执行&#xff0c;哪些不是。coverage是一个测量 Python 程序代码覆盖率的工具。它监视您的程序&#xff0c;注意代码的哪些部分已被执行&#xff0c;然后分析源代码以识别可能已执…

configure--prefix

本文主要说明--prefix参数的作用&#xff0c;其主要用在编译安装源代码应用中的./configure环节。 ./configure --help 查看详细的说明帮助 1、源码安装一般包括几个步骤&#xff1a;配置&#xff08;configure&#xff09;&#xff0c;编译&#xff08;make&#xff09;&…

路由策略 匹配工具 IP-Prefix

⦁ p-prefix-name&#xff1a;指定地址前缀列表的名称。字符串形式&#xff0c;长度范围是1&#xff5e;169&#xff0c;不支持空格&#xff0c;区分大小写。 ⦁ index index-number&#xff1a;指定本匹配项在地址前缀列表中的序号。整数形式&#xff0c;取值范围是1&am…

CondaValueError: The target prefix is the base prefix. Aborting.

报错截图 错误原因 conda命令错误 正确做法 conda create -n py38 python3.8

zuul 里面的 prefix 和 strip-prefix 怎么使用

首先两个是配置路由前缀的&#xff0c; 下面是我网上找的一段话&#xff1a; prefix &#xff1a;前缀&#xff0c;当请求匹配前缀时会进行代理strip-prefix &#xff1a;代理前缀默认会从请求路径中移除&#xff0c;通过该设置关闭移除功能&#xff0c; 当 stripPrefixtrue …

Trie树(Prefix Tree)介绍

本文用尽量简洁的语言介绍一种树形数据结构 —— Trie树。 一、什么是Trie树 Trie树&#xff0c;又叫字典树、前缀树&#xff08;Prefix Tree&#xff09;、单词查找树 或 键树&#xff0c;是一种多叉树结构。如下图&#xff1a; 上图是一棵Trie树&#xff0c;表示了关键字集…

configure --prefix=/的作用和用法

非root用户安装python和gcc的时候&#xff0c;总是需要设定这个&#xff0c;只知道是个路径&#xff0c;具体是什么路径&#xff0c;代表什么不清楚。 不明白就百度&#xff1a; configure --prefix/是干啥用的&#xff1f;这个路径代表了什么&#xff1f; Configure是一个可…

前缀和(Prefix Sum)

前缀和指一个数组的某下标之前的所有数组元素的和&#xff08;包含其自身&#xff09;。前缀和分为一维前缀和&#xff0c;以及二维前缀和。前缀和是一种重要的预处理&#xff0c;能够降低算法的时间复杂度&#xff0c;可以在 O ( 1 ) O(1) O(1)的时间复杂度内求出区间和。 一…

CMAKE_INSTALL_PREFIX

一、定义 CMAKE_INSTALL_PREFIX为cmake的内置变量&#xff0c;用于指定cmake执行install命令时&#xff0c;安装的路径前缀。Linux下的默认路径是/usr/local &#xff0c;Windows下默认路径是 C:/Program Files/${PROJECT_NAME} 二、用…

IP-Prefix List

地址前缀列表 一、IP-Prefix List二、语法及匹配规则1、语法2、匹配规则 三、配置案例1、拓扑2、分析ACL实现IP-Prefix List实现 四、IE考试题思考题 在进行配置案例前先了解一下基础知识 一、IP-Prefix List IP-Prefix List&#xff1a;能够同时匹配网络号和前缀长度 性能及可…

【脚本】更新依赖库pkgconfig文件中的prefix设置

在本地编译和安装了某个库后&#xff0c;如果其lib目录下存在pkgconfig子目录&#xff0c;则子目录下会存在若干.pc文件&#xff0c;文件中会有prefix的配置&#xff08;该配置标识当前库的安装路径&#xff09;&#xff0c;当要把该库拷贝到其他机器上时&#xff0c;如果库的路…

Elasticsearch学习--查询(prefix、wildcard、regexp、fuzzy)

一、前缀搜索 prefix 不计算相关度评分性能较差前缀搜索匹配的是分词后的词项前缀搜索没有缓存前缀搜索尽可能把前缀长度设置的更长 GET product/_search {"query": {"fuzzy": {"name": {"value": "product1"}}} } index…

bgp 使用route-map设置Local perference(本地优先属性)配置与详解

实验目的&#xff1a; 1、掌握基于route-map的本地优先配置方法。 2、使用route-map配置可以定置基于目标网络的本地优先。 实验拓扑&#xff1a; 接口IP配置及bgp基础配置详见 CSDNhttps://mp.csdn.net/mp_blog/creation/editor?spm1001.2014.3001.5352 查看R3与R4的路由…

使用route-map 配置BGP本地优先级

一、实验目的&#xff1a; 1、掌握基于route-map的本地优先配置方法。 2、使用route-map配置可以定置基于目标网络的本地优先级。 二、拓扑图&#xff1a; 三、配置BGP基本的配置&#xff1a; 1、配置各路由器的IP地址和BGP协议。配置完之后&#xff0c;查看一下R3和R4的路由表…

Cisco route-map 源地址路由配置

拓朴图&#xff1a; 案例&#xff1a; 公司内部使用的是一条拨号光纤和一条固定专线光纤&#xff0c;默认是指向拨号光纤出口那个网关出去&#xff0c;现在2网段有两台服务器&#xff08;WEB、Mail&#xff09;映射到公网&#xff0c;让外部来访问。 办公区因工作需要&#xf…

bgp route-map应用 配置 学习笔记

先全运行bgp R2 router bgp 2 no auto-summary no synchronzation bgp router-id 2.2.2.2 neighbor 12.1.1.1 remtotes as 10 neighbor 24.1.1.4 remote-as 10r1&#xff1a; router bgp 10 no auto-summary no synchronization bgp router-id 1.1.1.1 neighbor 12.1.1.2…

重分布和Route-MAP

一般在做重分布的时候用route-map较多&#xff0c;当然也可以用分发列表或者前缀列表等等&#xff0c;重分布的时候为了干掉不需要的路由&#xff0c;节约路由器CPU和转发效率可以使用route-map&#xff0c;当然route-map也可以用在其他的场景。 本次实验将ospf与rip重分布来使…