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

发布时间:2024年01月12日

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.Checked
        item.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:
                pass

        def 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.active
        sheet.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=fill
        cell_style.font=font
        cell_style.alignment=alignment
        workbook.add_named_style(cell_style)  # 将样式添加到工作簿的styles集合中

        sheet.column_dimensions['B'].width=30  # 列宽
        sheet.column_dimensions['D'].width=30
        sheet.column_dimensions['E'].width=30
        sheet.column_dimensions['G'].width=30

        # 写入表头并设置
        for col, header in enumerate(headers, start=1):  # 注意:openpyxl中的列索引从1开始
            cell=sheet.cell(row=1, column=col)  # 表头在第一行
            cell.value=header
            cell.style=cell_style
        self.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+1
                cell.value=value
            hang_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、实现结果

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

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

文章来源:https://blog.csdn.net/weixin_43820813/article/details/135534577
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。