公共用例库计划--个人版(三)导出Excel功能

1、任务概述

  本次计划的核心任务是开发一个,个人版的公共用例库,旨在将各系统和各类测试场景下的通用、基础以及关键功能的测试用例进行系统性地归纳整理,并以提高用例的复用率为目标,力求最大限度地减少重复劳动,提升测试效率。
  计划内容:完成公共用例库的开发实施工作,包括需求分析、系统设计、开发、测试、打包、运行维护等工作。

1.1、 已完成:

   需求分析、数据库表的设计:公共用例库计划–个人版(一)
   主体界面与逻辑设计:公共用例库计划–个人版(二)主体界面设计

1.2、 本次待完成:

  导入导出页面中,模块用例导出功能

2、界面设计

  还是先在Qt Designer中设计好导出界面。
想法是:

  • 1.在左侧选择要导出的模块
  • 2.然后选择导出文件格式,保存路径
  • 3.再点击导出。
  • 4.下方文本框,显示导出进度等信息。

将设计好的ui文件,转换成py。
在这里插入图片描述

3、逻辑实现

在主窗口下面,增加以下功能函数。使用信号槽机制。

3.1、选择模块

  全选/全不选的勾选框实现:
页面初始化时,新建self.selected_module_values集合。全选则将模块ID新增入集合,全不选就删除ID。

    def quanxuan(self):'''导出模块,全选/全不选'''is_checked=self.case.checkBox_2.isChecked()if not is_checked:  # 如果取消全选,则清空已选择的模块值集合self.selected_module_values.clear()check_state=Qt.CheckState.Checked if is_checked else Qt.CheckState.Unchecked  # 设置当前项的勾选状态def set_check_recursively(item: QTreeWidgetItem):item.setCheckState(0, check_state)if is_checked:module_value=int(item.text(1))  # 使用当前遍历到的item来获取文本并转换为整数self.selected_module_values.add(module_value)for i in range(item.childCount()):child_item=item.child(i)set_check_recursively(child_item)for i in range(self.case.mkliebiao_3.topLevelItemCount()):item=self.case.mkliebiao_3.topLevelItem(i)set_check_recursively(item)

模块单个选中:在模块列表单个选中,就将选中模块及其子模块勾选,同时将ID加入集合。取消选中就删除ID

    def on_item_clicked_down(self, item, column):'''导出功能,模块及其子模块选中或者取消选中'''parent_check_state=Qt.CheckState.Unchecked if item.checkState(column) == Qt.CheckState.Checked else Qt.CheckState.Checkeditem.setCheckState(column, parent_check_state)  # 设置当前项的勾选状态if item.checkState(column) == Qt.CheckState.Checked:self.selected_module_values.add(int(item.text(1)))  # 如果当前项被选中,则添加到 selected_module_values 集合else:try:self.selected_module_values.remove(int(item.text(1)))  # 如果当前项被取消选中,则从 selected_module_values 集合中移除except KeyError:passdef set_child_items_check_state(parent_item):for i in range(parent_item.childCount()):child_item=parent_item.child(i)child_item.setCheckState(column, parent_check_state)if child_item.checkState(column) == Qt.CheckState.Checked:  # 根据子项的新勾选状态处理列表self.selected_module_values.add(int(child_item.text(1)))else:self.selected_module_values.remove(int(child_item.text(1)))set_child_items_check_state(child_item)  # 递归调用set_child_items_check_state(item)  # 调用递归函数处理子模块

3.2、导出路径选择

点击按钮,打开文件夹,选择一个保存文件夹。不选,就赋值‘下载文件夹’

    def select_folder(self):'''选择保存路径,默认下载文件夹'''downloads_folder=QStandardPaths.writableLocation(QStandardPaths.StandardLocation.DownloadLocation)directory=QFileDialog.getExistingDirectory(self, "选择文件夹", downloads_folder)self.case.daochupath.setText(directory)

3.3、导出用例数据查询

传入选择的模块ID,判断是否只有1个,然后查询出所有模块ID下的用例。

    def download_sql(self):'''查询导出模块的用例'''values=tuple(self.selected_module_values)if len(self.selected_module_values) == 1:sql=f"select caseid,title,preconditions,step,expect,keyword,m.modulename,m.moduleid,priority,types,remarks,modificationdate from testcase t join module m on t.moduleid=m.moduleid where t.status='正常' and t.moduleid = {values[0]}"else:sql=f"select caseid,title,preconditions,step,expect,keyword,m.modulename,m.moduleid,priority,types,remarks,modificationdate from testcase t join module m on t.moduleid=m.moduleid where t.status='正常' and t.moduleid in {values}"sql=sql + " order by t.moduleid DESC,t.caseid DESC "self.case_db.connect()items=self.case_db.query_many(f"{sql}")  # 用例查询self.case_db.over()return items

3.4、导出Excel创建

传入查询出的用例数据,保存地址。然后先建Excel,建“用例”sheet,将表头等格式写入。最后写入用例数据,保存。

    def down_excel(self, items, exclname):"""新建Excel,与表头。写入用例"""headers=["用例编号", "用例标题", "前置条件", "步骤", "预期", "关键词", "所属模块", "所属模块ID","优先级", "用例类型", "备注", "修改日期"]workbook=Workbook()  # 新建sheet=workbook.activesheet.title="用例"# 创建单元格样式对象fill=PatternFill(start_color='F0F0F0', end_color='F0F0F0', fill_type='solid')  # 设置背景颜色(淡灰色)font=Font(bold=True)  # 设置字体加粗alignment=Alignment(horizontal='center', vertical='center')  # 设置水平和垂直居中对齐cell_style=NamedStyle(name="custom_style")  # 创建并定义样式cell_style.fill=fillcell_style.font=fontcell_style.alignment=alignmentworkbook.add_named_style(cell_style)  # 将样式添加到工作簿的styles集合中sheet.column_dimensions['B'].width=30  # 列宽sheet.column_dimensions['D'].width=30sheet.column_dimensions['E'].width=30sheet.column_dimensions['G'].width=30# 写入表头并设置for col, header in enumerate(headers, start=1):  # 注意:openpyxl中的列索引从1开始cell=sheet.cell(row=1, column=col)  # 表头在第一行cell.value=headercell.style=cell_styleself.case.daochulog.append(f"文件新建成功----{exclname}\n")hang_number=2  # 初始化行数为2(从第二行开始写入)for item in items:for col, value in enumerate(item):cell=sheet.cell(row=hang_number, column=col + 1)  # Excel索引是从1开始的,所以这里用col+1cell.value=valuehang_number+=1  # 行数增加workbook.save(f'{exclname}')  # 保存self.case.daochulog.append(f"-------------------用例导出完成,共写入【{hang_number - 2}】条用例数据-------------------")

3.5、导出按钮

点击导出按钮,先判断是否选中模块,再判断保存格式。最后一次调用查询、写入的函数。

    def download(self):'''导出用例按钮'''if not self.selected_module_values:self.ts.xinxi("请选中模块")elif self.case.geshi.currentIndex() == 1:self.ts.xinxi("暂不支持格式")else:items=self.download_sql()  # 查询导出用例self.case.daochulog.clear()  # 清空说明self.case.daochulog.append("导出数据说明:\n")if self.case.daochupath.text():path=self.case.daochupath.text()else:path=QStandardPaths.writableLocation(QStandardPaths.StandardLocation.DownloadLocation)self.case.daochulog.append(f"导出文件保存路径:{path}")if items:self.case.daochulog.append(f"查询到模块用例:{len(items)}条")current_time=datetime.now()formatted_time=current_time.strftime("%Y-%m-%d %H_%M_%S")exclname=f'{path}/导出用例{formatted_time}.xlsx'  # 保存路径 当前时间的时、分结尾命名self.down_excel(items, exclname)else:self.case.daochulog.append(f"已选模块用例数为0,请重新选择模块!")

3.6、实现结果

导出功能成功实现
在这里插入图片描述

导出用例数据:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/616790.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker Compose 部署 jenkins

Docker Compose 部署 jenkins jenkins 部署 Docker-Compose 部署 version: 3.1 services:jenkins:image: jenkinsci/blueoceanvolumes:- /data/jenkins/:/var/jenkins_home- /var/run/docker.sock:/var/run/docker.sock- /usr/bin/docker:/usr/bin/docker- /usr/lib/x86_64-…

网络层协议及IP编址与IP路由基础华为ICT网络赛道

目录 4.网络层协议及IP编址 4.1.网络层协议 4.2.IPv4地址介绍 4.3.子网划分 4.4.ICMP协议 4.5.IPv4地址配置及基本应用 5.IP路由基础 5.1.路由概述 5.2.静态路由 5.3.动态路由 5.4.路由高阶特性 4.网络层协议及IP编址 4.1.网络层协议 IPv4(Internet Protocol Versi…

第二百六十二回

文章目录 概念介绍使用方法示例代码使用扩展 我们在上一章回中介绍了flutter_screenutil包相关的内容,本章回中将介绍dart中的setter/getter方法.闲话休提,让我们一起Talk Flutter吧。 概念介绍 我们在这里介绍的setter/getter方法属于编程语言中的知识…

Android MediaCodec 简明教程(一):使用 MediaCodecList 查询 Codec 信息,并创建 MediaCodec 编解码器

系列文章目录 文章目录 系列文章目录前言一、MediaCodecList 是什么?二、MediaCodecList 使用方法1. 获取 MediaCodecList 实例2. 列出设备上支持的编解码器3. 获取编解码器详细信息4. 判断设备是否支持某种编解码器5. 查询默认的编解码器 三、通过 MediaCodecList …

【Java 设计模式】设计原则之开放封闭原则

文章目录 1. 定义2. 好处3. 应用4. 示例结语 在软件开发中,设计原则是创建灵活、可维护和可扩展软件的基础。 这些原则为我们提供了指导方针,帮助我们构建高质量、易理解的代码。 ✨单一职责原则(SRP) ✨开放/封闭原则&#xff08…

69、python - 利用向量内积来优化卷积运算

上一节介绍了利用 python 实现的原始卷积版本性能很差的原因,不知道各位同学有尝试的么? 这一节介绍下如何对卷积的乘累加进行一次优化:我们利用 np.dot 来进行优化。 np.dot np.dot 是 numpy 库提供的一个函数,用来计算两个向量的点积,或者叫内积。那什么是内积呢? …

Pygame程序的屏幕显示

不同对象的绘制与显示过程 在Pygame中,需要将所有需要在屏幕上显示的内容都绘制在一个display surface上。该Surface通常称为screen surface,它是pygame.display.set_mode()函数返回的Surface对象。 在绘制不同对象时,可以使用不同的绘制方…

AI绘画软件Stable Diffusion模型/Lora/VAE文件存放位置

型下载说明(下载模型后输入对应参数即可生成) 建议直接去civitai.com找模型,如果无法找到可以在幕后模型区找也可以去, 下载好后放入对应的文件夹。进入127.0.0.1:7680 左上角刷新即可看到新的模型。 模型种类 大模型 大模型特…

计算机找不到msvcr100.dll的多种解决方法分享,轻松解决dll问题

msvcr100.dll作为系统运行过程中不可或缺的一部分,它的主要功能在于提供必要的运行时支持,确保相关应用程序能够顺利完成编译和执行。因此,当操作系统或应用程序在运行阶段搜索不到该文件时,自然会导致各类依赖于它的代码无法正常…

C语言学习记录—进阶作业(通讯录动态版本)

动态版本通讯录 1. 通讯录默认能够存放3个人的信息。 2. 如果空间不够&#xff0c;就增加空间&#xff0c;每次增加2个人的空间。 contact.h文件 #pragma once #include <string.h> #include <stdio.h> #include <assert.h> #include <stdlib.h>#de…

C语言基础语法跟练 day3

31、不使用累计乘法的基础上&#xff0c;通过移位运算&#xff08;<<&#xff09;实现2的n次方的计算。 #include <stdio.h> int main() {int i 0;scanf("%d",&i);printf("%d",1<<i);return 0; } 32、问题&#xff1a;一年约有 3.…

L1-023 输出GPLT(Java)

给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序&#xff0c;按GPLTGPLT....这样的顺序输出&#xff0c;并忽略其它字符。当然&#xff0c;四种字符&#xff08;不区分大小写&#xff09;的个数不一定是一样多的&#xff0c;若某种字符已经输出完&…

c#多线程中使用SemaphoreSlim

SemaphoreSlim是一个用于同步和限制并发访问的类&#xff0c;和它类似的还有Semaphore&#xff0c;只是SemaphoreSlim更加的轻量、高效、好用。今天说说它&#xff0c;以及如何使用&#xff0c;在什么时候去使用&#xff0c;使用它将会带来什么优势。 代码的业务是&#xff1a…

档案数字化怎样快速整理资料

对于机构和组织来说&#xff0c;档案数字化是一个重要的信息管理和保护措施。要快速整理资料进行档案数字化&#xff0c;可以遵循以下步骤&#xff1a; 1. 准备工具和设备&#xff1a;确保有一台计算机、扫描仪和相关软件。 2. 分类和组织资料&#xff1a;先将资料分类&#xf…

【linux】利用echo命令实现不换行的倒计时

1、实现5秒倒计时 #!/bin/shfor i in `seq 5`doecho -ne "$i\b"sleep 1 done 2、实现“时:分:秒”格式的倒计时 这个脚本会从5小时开始,每秒更新一次,以时:分:秒的格式显示倒计时,实现一个从5小时倒计时到0的功能。echo -ne "\r"会将光标移动到当前行…

代码随想录Day.31 | 455. 分发饼干、376. 摆动序列、53. 最大子序和

455. 分发饼干 1. LeetCode链接 455. 分发饼干 - 力扣&#xff08;LeetCode&#xff09; 2. 题目描述 3. 解法 贪心法&#xff0c;首先想到的是&#xff0c;局部最优&#xff1a;让每个孩子尽可能拿能拿到的最小饼干尺寸。为了方便查找&#xff0c;这就要求至少饼干尺寸是从…

简单易懂深入PyTorch中RNN、LSTM和GRU使用和理解

目录 torch.nn子模块Recurrent Layers nn.RNNBase RNNBase 类描述 RNNBase 类的功能和作用 flatten_parameters() 方法 示例代码 nn.RNN RNN 类描述 RNN 类的功能和作用 RNN 类的参数 输入和输出 注意事项 示例代码 nn.LSTM LSTM 类描述 LSTM 类的功能和作用 …

MySQL的Windows系统安装

一、MySQL的Windows系统安装 1、下载MySQL安装包 打开如下链接地址&#xff0c;下载安装包 2、安装并配置 双击下载好的安装包进行安装&#xff0c;出现如下界面&#xff1a; 选择【 Full 】选项&#xff0c;然后单击【 Next 】按钮。 出现如下界面&#xff0c;单击【 Execute…

Halcon经典的边缘检测算子Sobel/Laplace/Canny

Halcon经典的边缘检测算子 文章目录 Halcon经典的边缘检测算子1. Sobel算子2. Laplace 算子3. Canny 算子4. 总结 关于边缘检测&#xff0c;有许多经典的算子&#xff0c;各大图形处理库都有各自的边缘检测算子&#xff0c;这里简要介绍几种。 1. Sobel算子 Sobel算子结合了高…

【野火i.MX6NULL开发板】挂载 NFS 网络文件系统

0、前言 参考资料&#xff1a; &#xff08;误人子弟&#xff09;《野火 Linux 基础与应用开发实战指南基于 i.MX6ULL 系列》PDF 第22章 参考视频&#xff1a;&#xff08;成功&#xff09; https://www.bilibili.com/video/BV1JK4y1t7io?p26&vd_sourcefb8dcae0aee3f1aab…