pytest与coverage联合使用

article/2025/10/23 9:13:57

目录

安装 

运行方式

命令行方式

 .py文件方式

测试结果各参数含义

pytest与coverage联合使用示例

运行方式

方式一:coverage的终端使用

方式二:运行run.py

report HTML页面结果


覆盖率测量通常用于衡量测试的有效性。Coverage可以显示测试正在执行代码的哪些部分,以及哪些部分没有被执行。

coverage作用:用于检查代码测试覆盖率的工具。

官方文档:Coverage.py — Coverage.py 6.6.0b1 documentation

 

安装 

# 安装
$ pip install coverage# 验证安装版本
$ coverage --version
Coverage.py, version 6.5.0 with C extension
Full documentation is at https://coverage.readthedocs.io

运行方式

命令行方式

# 搜集被测代码覆盖率信息,保存到 .coverage 文件中
$ coverage run 测试文件.py# 生成覆盖率统计结果报告
$ coverage report# 以HTML的形式生成覆盖率统计结果报告
$ coverage html

 .py文件方式

命名为run.py文件,放置在项目根目录下,具体如下:

import coverage
import pytest# 实例化对象
cov = coverage.coverage()
cov.start()# 测试
pytest.main(["-v", "-s"])# 结束分析
cov.stop()# 结果保存
cov.save()# 命令行模式展示结果,并展示未执行代码具体行数,用于测试结果查看使用
cov.report(show_missing=True)# 生成HTML覆盖率结果报告
cov.html_report(directory="res_html")

运行方式:进入到run.py文件所在路径执行以下命令

# 运行.py文件
$ python run.py

测试结果各参数含义

终端report里测试结果各参数含义:

  • Stmts :代码总行数
  • Miss:未执行代码行数
  • Cover:代码覆盖率

report HTML中测试结果各参数含义:

  • statements :代码总行数,不包含空行和注释行
  • missing:未执行代码行数
  • coverage:代码覆盖率

pytest与coverage联合使用示例

目录结构如下:

运行测试后的文件夹目录结构:

 运行测试+生成report HTML后的文件夹目录结构:

 各py文件内容具体如下:

# demofunc.pydef add(a, b):if isinstance(a, int) and isinstance(b, int):return a+belse:raise TypeError("数据类型错误")
# demofunc2.pydef add(a, b):raise NameError("名称错误")if isinstance(a, int) and isinstance(b, int):return a+belse:raise TypeError("数据类型错误")
# test_func.pyimport pytest
from demofunc import addclass Testfunc:# 正常测试用例def test_add_by_class(self):assert add(2, 3) == 5# 异常测试用例,期望结果为抛出TypeError异常def test_add_by_func_aaa(self, *args, **kwargs):with pytest.raises(TypeError) as E:add("3", 4)print(E.type)print(E.value)print(E.traceback)def test_zero_division_long():with pytest.raises(ZeroDivisionError) as excinfo:1 / 0print("----------------")print(excinfo.type)print(excinfo.value)print(excinfo.traceback)
# test_func2.pyimport pytest
from demofunc2 import addclass Testfunc:# 异常用例def test_add_by_func_aaa(self, *args, **kwargs):# 将预期中多个错误信息组成一个元组# with pytest.raises((TypeError, NameError), match=r"错误") as E:with pytest.raises((TypeError, NameError), match=r".*错.*$") as E:add("3", 4)# 检查断言装饰器@pytest.mark.xfail(raises=(TypeError, NameError))def test_add_by_func_aaa2(self):add("3", 4)

运行方式

方式一:coverage的终端使用

使用pytest作为run.py文件的内容:

# run.pyimport pytestif __name__ == "__main__":pytest.main(["-v", "-s"])

注意:使用此方式运行后,run.py文件会计入测试覆盖率中

运行后终端显示的结果如下:

# 进入到已安装了coverage的环境中# 运行run.py进行测试
PS F:\workspace\练习题\assertcode> coverage run run.py
======================================================== test session starts ========================================================
platform win32 -- Python 3.7.3, pytest-7.1.3, pluggy-1.0.0 -- c:\users\xxx\appdata\local\programs\python\python37\python.exe    
cachedir: .pytest_cache
rootdir: F:\workspace\练习题\assertcode
plugins: cov-4.0.0
collected 5 items                                                                                                                     test_case/test_func.py::Testfunc::test_add_by_func_aaa <class 'TypeError'>
数据类型错误
[<TracebackEntry F:\workspace\练习题\assertcode\test_case\test_func.py:15>, <TracebackEntry F:\workspace\练习题\assertcode\demofunc.py:5>]
PASSED
test_case/test_func.py::test_zero_division_long ----------------
<class 'ZeroDivisionError'>
division by zero
[<TracebackEntry F:\workspace\练习题\assertcode\test_case\test_func.py:23>]
test_case/test_func2.py::Testfunc::test_add_by_func_aaa PASSED
test_case/test_func2.py::Testfunc::test_add_by_func_aaa2 XFAIL=================================================== 4 passed, 1 xfailed in 0.05s ================================================================================== # 查看测试覆盖报告
PS F:\workspace\练习题\assertcode> coverage report
Name                      Stmts   Miss  Cover
---------------------------------------------
demofunc2.py                  5      3    40%
demofunc.py                   4      0   100%
run.py                        3      0   100%
test_case\test_func2.py       8      0   100%
test_case\test_func.py       18      0   100%
---------------------------------------------
TOTAL                        38      3    92%

方式二:运行run.py

使用pytest+coverage结合作为run.py文件的内容:

# run.pyimport coverage
import pytestcov = coverage.coverage()cov.start()pytest.main(["-v", "-s"])cov.stop()
cov.save()cov.report()
cov.html_report(directory="res_html")

注意:使用此方式运行后,run.py文件不计入测试覆盖率中

运行后终端显示的结果如下:

PS F:\workspace\练习题\assertcode> & C:/Users/xxx/Envs/ctpenv/Scripts/python.exe f:/workspace/练
习题/assertcode/run.py
======================================== test session starts =========================================
platform win32 -- Python 3.7.3, pytest-7.1.3, pluggy-1.0.0 -- C:\Users\xxx\Envs\ctpenv\Scripts\python.exe
cachedir: .pytest_cache
rootdir: F:\workspace\练习题\assertcode
plugins: anyio-3.6.1
collected 5 itemstest_case/test_func.py::Testfunc::test_add_by_func_aaa <class 'TypeError'>
数据类型错误
[<TracebackEntry F:\workspace\练习题\assertcode\test_case\test_func.py:15>, <TracebackEntry F:\workspace\练习题\assertcode\demofunc.py:5>]
PASSED
test_case/test_func.py::test_zero_division_long ----------------
<class 'ZeroDivisionError'>
division by zero
[<TracebackEntry F:\workspace\练习题\assertcode\test_case\test_func.py:23>]
test_case/test_func2.py::Testfunc::test_add_by_func_aaa PASSED
test_case/test_func2.py::Testfunc::test_add_by_func_aaa2 XFAIL=================================================== 4 passed, 1 xfailed in 0.05s ================================================================================== 
Name                      Stmts   Miss  Cover
---------------------------------------------
demofunc2.py                  5      3    40%
demofunc.py                   4      0   100%
test_case\test_func2.py       8      0   100%
test_case\test_func.py       17      0   100%
---------------------------------------------
TOTAL                        34      3    91%

report HTML页面结果

总计结果页面显示:

单个文件覆盖详情显示:

8bf449067f5f9269ab2728e03179e728.png


http://chatgpt.dhexx.cn/article/9h6YDP9P.shtml

相关文章

coverage代码覆盖率的使用~~

我们看下代码覆盖率的统计~&#xff0c;这个不必太揪心&#xff0c;觉得可以帮助你优化代码&#xff0c;可以看看&#xff0c;也不要带在意~ 1、先在cmd命令窗口在线安装coverage 1 pip install coverage 2、安装完毕后我们在cmd命令窗口输入&#xff1a;命令 ----- 从当前目录…

条件覆盖(Condition coverage)

一个判定中往往包含了若干个条件&#xff0c;例如图6.4的程序中&#xff0c;判定(A&#xff1e;1) AND (B0)包含了两个条件&#xff1a;A&#xff1e;1以及B0&#xff0c;所以可引进一个更强的覆盖标准——“条件覆盖”“条件覆盖”的含义是&#xff1a;执行足够的测试用例&…

Java|Eclipse中Coverage As的功能说明

Coverage As 用于测试代码的覆盖率 绿色&#xff1a;代码被执行过黄色&#xff1a;代码部分被执行过红色&#xff1a;代码没有被执行过

go coverage 覆盖率工具

文章 https://go.dev/blog/cover 测试覆盖度 定义&#xff1a;Test coverage(测试覆盖度)用于衡量一个包中的代码被测试用例覆盖的程度。 如果运行所有的测试用例能够触发包中80%的代码运行&#xff0c;我们就认为测试覆盖度为80%。 通常情况下&#xff0c;要计算测试覆盖率…

gtest-coverage

原文地址https://paul.pub/gtest-and-coverage/ 对代码进行单元测试是几乎每个软件工程师都要完成的工作。本文以C语言为基础&#xff0c;讲解如何进行单元测试并生成测试报告。 前言 测试是软件开发过程中一个必须的环节&#xff0c;测试确保软件的质量符合预期。 对于工程…

Formal Verification (五) coverage、sign-off flow

coverage type formal和simulation一样&#xff0c;也是基于coverage-driven的验证方式&#xff1b;针对formal的coverage metrics&#xff0c;可以分为以下几种&#xff08;不同工具定义略有不同&#xff0c;本文以Jaspergold为例&#xff09;&#xff1a; code coverage c…

Idea coverage覆盖率测试工具的使用

知其然 知其所以然创作不易 求点赞&#x1f44d; 求关注❤️ 求分享&#x1f465;絮叨 最近项目中&#xff0c;每次Build的时候会触发sonar程序去扫描代码&#xff0c;打出测试覆盖率&#xff0c;也就是coverage。如果不到80%以上&#xff0c;就要去补Test case。可是我们在开…

SV -- Coverage 覆盖率

SV – Coverage 覆盖率 本文内容来自&#xff1a; http://www.asic-world.com/systemverilog/coverage.htmlhttps://verificationguide.com/systemverilog/systemverilog-array-manipulation-methods/https://blog.csdn.net/bleauchat/article/details/90445713 (本文的主要来源…

VCS coverage覆盖率工具常用功能

目录 简介 Coverage Metrics覆盖指标&#xff1a; merge VCS相关命令 常用编译选项&#xff1a; 常用仿真选项&#xff1a; 系统函数&#xff1a; 使用URG及其参数&#xff1a; 用DVE查看coverage&#xff1a; 简介 可通过 -cm_hier 配置文件来控制覆盖率收集范围 C…

vcs/urg 进行覆盖率coverage merge及部分merge到整体

目录 1.vcs收coverage基本Option 2.相同代码的merge 3.部分merge到整体 3.1 mapfile 3.2 -map使用语法 3.3合并的常见问题 3.3.1 UCAPI-MAP-SHAPEMISMATCH coverage相关的用户手册可以在本人的百度云盘中查看Coverage Technology User Guide.pdf 还可以参考gsithxy的博文…

代码覆盖率 ——语句覆盖 Statement Coverage、分支覆盖 Branch Coverage、 路径覆盖 Path Coverage的区别

我们以下面代码为例&#xff1a; public static boolean Method(boolean a, boolean b) {int x 2;int y -4;if(a)x y;elsex -2*x;if(b)y 0-x;return ((100/(xy))> 0);}语句覆盖 Statement Coverage 当我们要实现100% Statement Coverage&#xff0c;只需以下两个test…

NGS 测序深度和覆盖度—Depth、Coverage

文章目录 前言这是比较基本的两个概念&#xff1a;二者的关系&#xff1a;例子&#xff1a;使用**bamdst**计算覆盖度安装 使用参考&#xff1a; 前言 温故而知新&#xff0c;刚入门的时候没有好好记笔记&#xff0c;现在补上&#x1f611; 公众号&#xff1a;猪猪的乌托邦 这…

idea插件Coverage(用例覆盖率)使用

idea插件Coverage&#xff08;用例覆盖率&#xff09;使用 选择测试用例中要执行的包、类或方法&#xff0c;右键选择Run …with Coverage。 执行结束后可在右侧查看覆盖率结果。可以点击导出按钮导出覆盖率报告。注意&#xff1a;若只执行了包中的某个类或方法&#xff0c;则…

浅谈coverage

背景描述&#xff1a; 公司需要对测试用例的对工程代码的覆盖率做统计&#xff0c;因此需要用到coverage&#xff0c;这里有个特殊的点&#xff0c;公司的工程运行时要在容器中进行的。 实际应用&#xff1a; 1. 首先&#xff0c;需要下载coverage&#xff1a; pip3 install…

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…