【Python】数据可视化利器PyCharts在测试工作中的应用
目录
PyCharts 简介
PyCharts 的安装
缺陷统计
测试用例执行情况
使用JavaScript情况
缺陷趋势分析
将两张图放在一个组合里(grid)
将两张图重叠成一张图(overlap)
将多张图组合在一个page 中(page)
实际应用:常态化性能压测数据统计
总结
资料获取方法
PyCharts 简介
PyCharts 是一个基于 Python 的数据可视化库,它支持多种图表类型,如折线图、柱状图、饼图等。PyCharts 提供了简洁的 API,使得用户能够轻松地创建各种图表,同时支持个性化的配置,以满足不同需求。PyCharts 的底层依赖于 ECharts,这使得它在功能和性能上都具有很高的优势。
PyCharts 的安装
PyCharts 的安装非常简单,只需在命令行中输入以下命令:
pip install pyecharts
安装完成后,即可在 Python 代码中导入 PyCharts 库并开始使用。
作为软件测试工程师,我们经常需要处理测试过程中的数据。文不如表、表不如图,通过 PyCharts,我们可以轻松的将这些数据以直观的形式展示出来,从而更好地分析问题、汇报进度。
缺陷统计
在软件测试过程中,我们需要对发现的缺陷进行统计和分析。以下代码演示了如何使用 PyCharts 创建一个饼图,展示各个严重级别的缺陷数量:
from pyecharts.charts import Pie
from pyecharts import options as optspie = Pie()
pie.add("", [("建议", 33), ("一般", 45), ("严重", 20), ("致命", 2)])
pie.set_global_opts(title_opts=opts.TitleOpts(title="缺陷严重级别统计"))
pie.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)"))
pie.render()
执行上面的代码会自动的在同级目录生成一个 render.xml
文件,使用浏览器打开就可以看到展示了不同严重级别的缺陷数量及其占比的饼图。我们可以依据这个图更好地制定测试策略和优先级。
当然,我们也可以在 render 之前加上下面这段代码来指定颜色,得到下面这张图:
# 指定颜色
colors = ["#0000FF", "#4169E1", "#1E90FF", "#00BFFF"]
pie.set_colors(colors)
测试用例执行情况
在执行测试用例时,我们需要关注测试用例的执行情况,如通过率、失败率等。以下代码演示了如何使用 PyCharts 创建一个堆叠柱状图,展示各个模块的测试用例执行情况:
from pyecharts.charts import Bar
from pyecharts import options as optsbar = Bar()
bar.add_xaxis(["模块A", "模块B", "模块C", "模块D", "模块E"])# 添加通过和失败的数据,并设置为堆叠模式
bar.add_yaxis("通过", [90, 80, 70, 60, 50], stack="总量")
bar.add_yaxis("失败", [10, 20, 30, 40, 50], stack="总量")# 设置全局选项,包括标题
bar.set_global_opts(title_opts=opts.TitleOpts(title="测试用例执行情况"),)# 设置系列选项,包括标签格式
bar.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position="outside", formatter="{c}%")) # 显示百分比的标签格式bar.render()
这段代码创建了一个堆叠柱状图,展示了各个模块的测试用例通过和失败数量。通过这样的图表,我们可以直观地了解到各个模块的测试情况,从而更好地调整测试计划和资源分配。
使用JavaScript情况
因为pycharts 底层基于 ECharts,所以 JavaScript代码也可以在脚本中使用。
在 Python 中调用 JavaScript 代码:
from pyecharts.charts import Bar
from pyecharts import options as opts
from pyecharts.commons.utils import JsCodebar = Bar()
bar.add_xaxis(["模块A", "模块B", "模块C", "模块D", "模块E"])passed_cases = [90, 75, 76, 69, 58]# 添加通过和失败的数据,并设置为堆叠模式
bar.add_yaxis("通过",passed_cases,stack="总量",label_opts=opts.LabelOpts(is_show=False) # 隐藏通过用例的标签
)# 使用回调函数计算失败用例的百分比
failure_percentage = f"""
function(params) {{var passed_cases = {passed_cases};var total = params.value + passed_cases[params.dataIndex];var percentage = (params.value / total) * 100;return percentage.toFixed(2) + '%';
}}
"""bar.add_yaxis("失败",[10, 20, 30, 40, 50],stack="总量",label_opts=opts.LabelOpts(is_show=True, position="inside", formatter=JsCode(failure_percentage)) # 显示失败用例的标签
)# 设置全局选项,包括标题
bar.set_global_opts(title_opts=opts.TitleOpts(title="测试用例执行情况"),
)bar.render()
缺陷趋势分析
在项目进展过程中,我们需要关注缺陷的趋势,以评估项目质量和进度。以下代码演示了如何使用 PyCharts 创建一个折线图,展示项目中缺陷的趋势变化:
from pyecharts.charts import Line
from pyecharts import options as opts# 创建 Line 对象
line = Line()# 添加 x 轴数据
line.add_xaxis(["第一周", "第二周", "第三周", "第四周", "第五周"])# 新增问题单和已修复问题单的数据
new_defects = [50, 35, 28, 20, 5]
fixed_defects = [5, 20, 30, 33, 50]# 计算剩余未修复的问题单
remaining_defects = []
cumulative_new_defects = 0
cumulative_fixed_defects = 0# 遍历新增问题单和已修复问题单的数据
for new, fixed in zip(new_defects, fixed_defects):# 累积计算新增问题单和已修复问题单的数量cumulative_new_defects += newcumulative_fixed_defects += fixed# 计算剩余未修复的问题单,并将结果添加到 remaining_defects 列表中remaining_defects.append(cumulative_new_defects - cumulative_fixed_defects)# 向图表中添加 y 轴数据系列
line.add_yaxis("新增缺陷", new_defects)
line.add_yaxis("已修复缺陷", fixed_defects)
line.add_yaxis("剩余未修复问题单", remaining_defects)# 设置全局选项,包括标题
line.set_global_opts(title_opts=opts.TitleOpts(title="缺陷趋势分析"))# 渲染图表
line.render()
这段代码创建了一个折线图,展示了项目中新增缺陷和已修复缺陷的数量变化。通过这样的图表,我们可以直观地了解到项目的质量趋势,从而更好地制定测试策略和计划。
将两张图放在一个组合里(grid)
体现随着时间的变化,执行用例和 bug 情况的变化:
from pyecharts.charts import Line, Bar, Grid
from pyecharts import options as opts# 创建 Line 对象new_defects = [50, 35, 28, 20, 5]
fixed_defects = [5, 20, 30, 33, 50]remaining_defects = []
cumulative_new_defects = 0
cumulative_fixed_defects = 0for new, fixed in zip(new_defects, fixed_defects):cumulative_new_defects += newcumulative_fixed_defects += fixedremaining_defects.append(cumulative_new_defects - cumulative_fixed_defects)line = (Line().add_xaxis(["第一周", "第二周", "第三周", "第四周", "第五周"]).add_yaxis("新增缺陷", new_defects).add_yaxis("已修复缺陷", fixed_defects).add_yaxis("剩余未修复问题单", remaining_defects)# 设置全局选项,包括标题.set_global_opts(title_opts=opts.TitleOpts(title="缺陷趋势分析"),legend_opts=opts.LegendOpts(pos_top="48%"),))
# 添加执行用例数的数据
executed_cases = [150, 170, 195, 110, 86]# 创建 Bar 对象
bar = (Bar().add_xaxis(["第一周", "第二周", "第三周", "第四周", "第五周"])
.add_yaxis("执行用例数", executed_cases))# 创建 Grid 对象,并添加 Line 和 Bar 图表
grid = (Grid().add(bar, grid_opts=opts.GridOpts(pos_bottom="60%")).add(line, grid_opts=opts.GridOpts(pos_top="60%")))# 渲染图表
grid.render()
将两张图重叠成一张图(overlap)
from pyecharts.charts import Line, Bar
from pyecharts import options as opts# 创建 Bar 对象
bar = Bar()
bar.add_xaxis(["第一周", "第二周", "第三周", "第四周", "第五周"])# 添加执行用例数的数据
executed_cases = [15, 17, 19.5, 11, 3]
bar.add_yaxis("执行用例数(/百条)", executed_cases)# 创建 Line 对象
line = Line()
line.add_xaxis(["第一周", "第二周", "第三周", "第四周", "第五周"])new_defects = [50, 35, 28, 20, 5]
fixed_defects = [5, 20, 30, 33, 40]remaining_defects = []
cumulative_new_defects = 0
cumulative_fixed_defects = 0for new, fixed in zip(new_defects, fixed_defects):cumulative_new_defects += newcumulative_fixed_defects += fixedremaining_defects.append(cumulative_new_defects - cumulative_fixed_defects)# 设置 is_smooth=True 参数使折线平滑显示
line.add_yaxis("新增缺陷", new_defects)
line.add_yaxis("已修复缺陷", fixed_defects)
line.add_yaxis("剩余未修复问题单", remaining_defects)# 使用 overlap() 方法将 Line 图表叠加到 Bar 图表中
bar.overlap(line)# 设置全局选项,包括标题
bar.set_global_opts(title_opts=opts.TitleOpts(title="缺陷趋势分析"))# 渲染图表
bar.render()
将多张图组合在一个page 中(page)
from pyecharts.charts import Line, Bar, Page, Pie, Grid
from pyecharts import options as opts# 创建 Line 对象
new_defects = [50, 35, 28, 20, 5]
fixed_defects = [5, 20, 30, 33, 50]remaining_defects = []
cumulative_new_defects = 0
cumulative_fixed_defects = 0for new, fixed in zip(new_defects, fixed_defects):cumulative_new_defects += newcumulative_fixed_defects += fixedremaining_defects.append(cumulative_new_defects - cumulative_fixed_defects)line = (Line().add_xaxis(["第一周", "第二周", "第三周", "第四周", "第五周"]).add_yaxis("新增缺陷", new_defects).add_yaxis("已修复缺陷", fixed_defects).add_yaxis("剩余未修复问题单", remaining_defects)# 设置全局选项,包括标题.set_global_opts(title_opts=opts.TitleOpts(title="趋势分析(缺陷/用例)"),legend_opts=opts.LegendOpts(pos_top="48%"),))
# 添加执行用例数的数据
executed_cases = [150, 170, 195, 110, 86]# 创建 Bar 对象
bar = (Bar().add_xaxis(["第一周", "第二周", "第三周", "第四周", "第五周"])
.add_yaxis("执行用例数", executed_cases))# 创建 Grid 对象,并添加 Line 和 Bar 图表
grid = (Grid().add(bar, grid_opts=opts.GridOpts(pos_bottom="60%")).add(line, grid_opts=opts.GridOpts(pos_top="60%")))# 渲染图表
grid.render()pie = Pie()
pie.add("", [("建议", 33), ("一般", 45), ("严重", 20), ("致命", 2)])
pie.set_global_opts(title_opts=opts.TitleOpts(title="缺陷严重级别统计"))
pie.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)"))
# 指定颜色
colors = ["#0000FF", "#4169E1", "#1E90FF", "#00BFFF"]
pie.set_colors(colors)# 创建 Page 对象,并添加图表
page = Page()
page.add(grid)
page.add(pie)# 渲染图表
page.render()
实际应用:常态化性能压测数据统计
import random
from pyecharts.charts import Line, Bar, Grid, Pie, Page
from pyecharts import options as opts
# 查询过去 8 次数据
time_range = 8interface = ['充值', '赠送', '支付', '支付回退', '预授权']
bar = (Bar().add_xaxis(interface).add_yaxis("支付", [113, 106, 122, 128, 128, 55, 45]).add_yaxis("券", [75, 46, 75, 65, 118, 15, 70]).add_yaxis("限额限频", [173, 146, 175, 165, 218, 115, 170]).add_yaxis("全流程", [65, 46, 70, 65, 108, 45, 40]).set_global_opts(title_opts=opts.TitleOpts(title="TPS(当前版本)"))
)
line = Line().add_xaxis([f"2023-07-0{i} 05:04:2{i}" for i in range(1, time_range)]). \add_yaxis(interface[0], [random.randint(100, 150) for _ in range(time_range)])for i, inter in enumerate(interface):line.add_yaxis(inter, [random.randint(10 * (i + 1), 100) for _ in range(time_range)],label_opts=opts.LabelOpts(is_show=False))
line.set_global_opts(title_opts=opts.TitleOpts(title="性能趋势(支付)", pos_top="48%"),legend_opts=opts.LegendOpts(pos_top="48%"),yaxis_opts=opts.AxisOpts(name="TPS",axislabel_opts=opts.LabelOpts(is_show=False), # 设置label_opts参数)
)grid = Grid().add(bar, grid_opts=opts.GridOpts(pos_bottom="60%")).add(line, grid_opts=opts.GridOpts(pos_top="60%"))pie = Pie()
pie.add("-", [("已剔除", 2), ("梳理中", 2), ("已完成", 15), ("优化中", 13), ("时间规划中", 13)])
pie.set_global_opts(title_opts=opts.TitleOpts(title="摸底系统统计"), )
# - `{a}`:表示系列名称。`{b}`:表示数据类别 `{c}`:表示数据值(如10、25、50和15)。`{d}`:表示数据所占的百分比。- `{@[index]}`:表示数据数组中索引为`index`的值。
pie.set_series_opts(label_opts=opts.LabelOpts(formatter="{a}{b}: {c} ({d}%)"))page = Page()
page.add(grid)
page.add(pie)
page.render()
总结
PyCharts 是一个功能强大、易于使用的 Python 数据可视化库。本文以测试工程师的日常工作中的一些数据举例,演示了如何展示测试数据,从而提高工作效率,更好地服务于项目进展。本文仅介绍了 PyCharts 的基本使用和一些常见的应用场景,实际上 PyCharts 还有更多的功能等待我们去探索。希望本文能对大家的工作带来帮助。
资料获取方法
【留言777】
各位想获取源码等教程资料的朋友请点赞 + 评论 + 收藏,三连!
三连之后我会在评论区挨个私信发给你们~
相关文章:

【Python】数据可视化利器PyCharts在测试工作中的应用
目录 PyCharts 简介 PyCharts 的安装 缺陷统计 测试用例执行情况 使用JavaScript情况 缺陷趋势分析 将两张图放在一个组合里(grid) 将两张图重叠成一张图(overlap) 将多张图组合在一个page 中(page࿰…...

AOP的实战(统一功能处理模块)
一、用户登录权限效验 用户登录权限的发展从之前每个方法中自己验证用户登录权限,到现在统一的用户登录验证处理,它是一个逐渐完善和逐渐优化的过程。 1.1 最初用户登录验证 我们先来回顾一下最初用户登录验证的实现方法: RestController…...

时间复杂度为O(n2)的三种简单排序算法
1.冒泡排序 冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少少一个元素移动到它应该在的位置,重复n次,就完成了n个数据的排序工作。 /*** …...

LeetCode 热题 100 JavaScript --226. 翻转二叉树
给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 3: 输入:root [] 输出:[] 提示: 树中节点数目范围在 [0, 100] 内 -100 < Node.val < 100 var invertTree function(root…...
hive所有窗口函数详情总结
hive窗口函数详情总结 解释语法hive开窗函数排序开窗函数样例数据RANK()DENSE_RANK()ROW_NUMBER() 分析开窗函数样例数据:last_valuefirst_valuelaglead 其他窗口函数cume_distpercent_rank 解释 开窗函数用于为行定义一个窗口(指运算将要操作的行的集合…...

Talk | 新加坡国立大学博士生施宇钧:DragDiffusion-基于扩散模型的关键点拖拽图片编辑
本期为TechBeat人工智能社区第518期线上Talk! 北京时间8月2日(周三)20:00, 新加坡国立大学博士生—施宇钧的Talk已准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “DragDiffusion-基于扩散模型的关键点拖拽图片编辑”,他…...
22 | 贝叶斯分类算法
文章目录 介绍什么是贝叶斯分类算法?贝叶斯分类算法的应用场景贝叶斯定理贝叶斯定理的基本原理贝叶斯定理的公式推导贝叶斯定理的应用举例代码介绍 什么是贝叶斯分类算法? 贝叶斯分类算法是一类基于贝叶斯定理的分类技术。在统计分类任务中,这些算法使用特定的假设来建立特…...
java.sql.SQLSyntaxErrorException: ORA-00909: 参数个数无效
问题: 在Select里采用Contact(%,#name,%)报错参数个数无效 原因: 回想以前用Mysql的时候就是这样用的,没有问题,在这里就出问题了,所以确定问题在oracle数据库上,经过查询得知,oracle和mysql…...
数据结构8-哈希表
数据结构8-哈希表 动态分配内存方式: #include <stdio.h> #include <stdlib.h>#define SIZE 20struct DataItem {int data; int key; };struct DataItem* hashArray[SIZE]; struct DataItem* dummyItem; struct DataItem* item;//获取键值 int has…...

vue3引用Font-Awesome字体图标库
环境:vue3tsviteelement plus 介绍:这里安装引用的是Font-Awesome 6.x 版本,有专业版(付费),这里只介绍免费版字体使用方法 一、安装 1.使用npm安装,终端打开项目目录或者命令行cd到目录文件夹…...
Python: Django 服务部署可能遇到的一些问题
502 bad gateway 不要用 python3 manage.py runserver 启动服务, 而要用: daphne -b 0.0.0.0 -p <端口> <工程名>.asgi:application此外,在 setting.py 中,修改: import osSECRET_KEY os.environ.get(D…...

Python爬虫时遇到连接超时解决方案
在进行Python爬虫任务时,经常会遇到连接超时(TimeoutError)错误。连接超时意味着爬虫无法在规定的时间内建立与目标服务器的连接,导致请求失败。为了帮助您解决这个常见的问题,本文将提供一些解决办法,并提…...

这所国字头双一流,根本招不满,学硕都没人报!
一、学校及专业介绍 中国民航大学,位于天津市,是民航局、天津市、教育部共建高校,是天津市“双一流”建设高校和高水平特色大学建设高校。 1.1 招生情况 2023年中国民航大学电子信息与自动化学院,初试考806信号与系统的一共有两…...
macos 查询端口占用 命令
在 macOS 上查询端口占用的命令是通过使用lsof(list open files)工具来实现的。 lsof可以显示当前系统中打开的文件(包括网络连接和端口)的相关信息。 打开终端应用程序(Terminal),然后输入以下…...

无代码开发:打破传统开发模式,引领数字化转型新方向
随着数字化转型的加速,企业对于高效、便捷的软件开发需求愈发旺盛。无代码开发作为一种新兴的软件开发模式,以其可视化、模块化的开发方式,为数字化转型提供了新的方向。本文将从无代码开发的优势、应用场景、如何实现等方面进行详细解读&…...

go-zero超强工具goctl的常用命令api,rpc,model及其构建的服务解析
goctl api 详情移步: go-zero的路由机制解析 基于go-zero的api服务刨析并对比与gin的区别 goctl rpc goctl支持多种rpc,较为流行的是google开源的grpc,这里主要介绍goctl rpc protoc的代码生成与使用。 protoc是grpc的命令,作用…...

手机python编程软件怎么用,手机python编程软件下载
大家好,小编来为大家解答以下问题,手机python编程软件保存的代码在哪里,手机python编程软件怎么运行,现在让我们一起来看看吧! 原标题:盘点几个在手机上可以用来学习编程的软件 前天在悟空问答的时候&#…...

【使用 DSP 滤波器加速速度和位移】使用信号处理算法过滤加速度数据并将其转换为速度和位移研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

家居行业解决方案 | 君子签电子签约助力家居企业减负增效
过去,家居行业因供需两端碎片化、服务链条较长等因素,导致线上发展较为缓慢,近年来,互联网的发展推动直播电商、兴趣电商兴起,促使家居行业数字化建设需求越来越为迫切。 合同管理作为家居行业企业经营的一项重要管理…...

Nodejs 第五章(Npm run 原理)
npm run xxx 发生了什么 按照下面的例子npm run dev 举例过程中发生了什么 读取package json 的scripts 对应的脚本命令(dev:vite),vite是个可执行脚本,他的查找规则是: 先从当前项目的node_modules/.bin去查找可执行命令vite如果没找到就去全局的node…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...