Deepseek API+Python测试用例一键生成与导出-V1.0.2【实现需求文档图片识别与用例生成自动化】

news2025/3/18 13:00:00

在测试工作中,需求文档中的图片(如界面设计图、流程图)往往是测试用例生成的重要参考。然而,手动提取图片并识别内容不仅耗时,还容易出错。本文将通过一个自研小工具,结合 PaddleOCR 和大模型,自动从需求文档的指定标题下提取图片,识别图片中的文字,并生成功能测试用例。这一流程能帮助测试工程师大幅提高效率,同时确保用例生成的精准性。支持同时指定文本标题及图片标题。感兴趣的同学点击下面小卡片获取源码相对于前面的版本:

  • 优化了一些报错导致闪退的情形
  • 增加了图片标题输入框
  • 布局调整
  • 增加了行业下拉选择框
    在这里插入图片描述

一、整体解决方案

我们将完成以下功能:

  1. 从 Word 文档中提取图片:通过 python-docx 提取指定标题下的图片。
  2. 图片文字识别:使用 PaddleOCR 对图片中的文字内容进行识别。
  3. 用例生成:将识别到的文字内容传递给大模型(如 OpenAI GPT),自动生成功能测试用例。

整个工具的实现框架如下:

+-------------------------------------------+
|  需求文档加载                              |
|  读取 Word 文档 (docx)                     |
+-------------------------------------------+
                   ↓
+-------------------------------------------+
|  图片提取                                   |
|  识别指定标题下的图片                      |
+-------------------------------------------+
                   ↓
+-------------------------------------------+
|  图片文字识别                               |
|  使用 PaddleOCR 识别图片中的文字           |
+-------------------------------------------+
                   ↓
+-------------------------------------------+
|  用例生成                                   |
|  将识别文字传递给大模型生成测试用例         |
+-------------------------------------------+
                   ↓
+-------------------------------------------+
|  输出测试用例                               |
|  将生成的测试用例保存为文档                 |
+-------------------------------------------+

二、工具实现步骤

1. 环境准备

安装以下必要的 Python 库:

pip install python-docx paddleocr paddlepaddle openai
  • python-docx:用于读取 Word 文档。
  • paddleocrpaddlepaddle:用于图片文字识别。
  • openai:与大模型交互生成测试用例。

2. 提取 Word 文档中指定标题下的图片

在需求文档中,图片通常位于某些特定的标题下(如“登录界面设计”)。我们使用 python-docx 遍历文档内容并提取这些图片。

代码示例:


# 提取指定标题下的图片
    def extract_text_by_title(self, docx_path, title_keywords, table_keywords, pic_keywords):
        """
        提取多个标题下的正文内容
        :param pic_keywords: 图片路径
        :param table_keywords: 表格路径
        :param docx_path: docx 文件路径
        :param title_keywords: 标题关键词列表
        :return: 提取的正文内容(按标题分组)
        """
        doc = Document(docx_path)
        result = {}
        doc = self.remove_toc(doc)  # 先清理一波目录
        for title_keyword in title_keywords.split(','):
            content = []
            capture = False
            for paragraph in doc.paragraphs:
                text = paragraph.text.strip()
                if text:
                    # 判断是否是标题
                    if title_keyword in text and 'toc' not in paragraph.style.name.lower():
                        capture = True
                        content.append(text)
                        continue
                    # 停止捕获正文内容
                    if capture and re.match(r"^\d+(\.\d+)*\s+.+", text):  # 新标题
                        break
                    elif "标题" in paragraph.style.name and capture:  # 遇到下一个标题则停止获取
                        break
                    # 捕获正文内容
                    if capture and text:
                        content.append(text)
            result[title_keyword] = "\n".join(content)
        for pic_keyword in pic_keywords.split(','):
            image_paths = self.get_target_pic(docx_path, pic_keyword)
            print(image_paths)
            if not image_paths:
                print("未找到目标标题下的图片")
            else:
                print(f"提取到 {len(image_paths)} 张图片:{image_paths}")
                # OCR 识别
                print("\n正在进行 OCR 识别...")
                ocr_results = self.perform_ocr_with_paddle(image_paths)
                # 输出结果
                ocr_results_text = ''
                for image_path, text in ocr_results:
                    # print(f"\n图片路径:{image_path}")
                    # print(f"识别内容:\n{text}")
                    ocr_results_text += text + '--'
                result['识别内容'] = ocr_results_text
        return result

示例:提取“业务流程”标题下的图片

在这里插入图片描述


3. 使用 PaddleOCR 进行图片文字识别

使用 PaddleOCR 对提取的图片进行文字识别,并输出识别结果。

代码示例:


    def perform_ocr_with_paddle(self, images):
        """
        使用 PaddleOCR 对图片进行文字识别。
        """
        results = []
        # 初始化 PaddleOCR
        ocr = PaddleOCR(use_angle_cls=True, lang="ch")  # 支持方向分类和中英文混合识别
        for image_path in images:
            try:
                img = cv2.imread(image_path)
                ocr_result = ocr.ocr(img, cls=True)
                text_lines = [line[1][0] for line in ocr_result[0]]
                results.append((image_path, "\n".join(text_lines)))
            except Exception as e:
                results.append((image_path, f"OCR 识别失败: {e}"))
        return results

识别结果如图:

在这里插入图片描述

4. 交互大模型生成测试用例

将识别到的文字内容传递给大模型(如 OpenAI GPT),并生成功能测试用例。

代码示例:

    def generate_cases(self, content_param, prompt_param, job_area):
        # 初始化OpenAI客户端
        client = OpenAI(
            # 如果没有配置环境变量,请用百炼API Key替换:api_key="sk-xxx"
            api_key='sk-xxx',  # todo 此处需更换
            base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
        )

        reasoning_content = ""  # 定义完整思考过程
        answer_content = ""  # 定义完整回复
        is_answering = False  # 判断是否结束思考过程并开始回复

        # 创建聊天完成请求
        completion = client.chat.completions.create(
            model="deepseek-r1",  # 此处以 deepseek-r1 为例,可按需更换模型名称
            messages=[
                {'role': 'user', 'content': f'所在行业: {job_area if job_area else None};文档内容: {content_param}, 提示词:{prompt_param}'}
            ],
            stream=True,
            # 解除以下注释会在最后一个chunk返回Token使用量
            # stream_options={
            #     "include_usage": True
            # }
        )

        print("\n" + "=" * 20 + "思考过程" + "=" * 20 + "\n")

        for chunk in completion:
            # 如果chunk.choices为空,则打印usage
            if not chunk.choices:
                print("\nUsage:")
                print(chunk.usage)
            else:
                delta = chunk.choices[0].delta
                # 打印思考过程
                if hasattr(delta, 'reasoning_content') and delta.reasoning_content != None:
                    print(delta.reasoning_content, end='', flush=True)
                    reasoning_content += delta.reasoning_content
                else:
                    # 开始回复
                    if delta.content != "" and not is_answering:
                        print("\n" + "=" * 20 + "完整回复" + "=" * 20 + "\n")
                        is_answering = True
                    # 打印回复过程
                    print(delta.content, end='', flush=True)
                    answer_content += delta.content
        return answer_content

5. 输出测试用例到文档

将生成的JSON格式的测试用例保存为 Excel文档,便于后续查看和管理。

代码示例:

    def json_to_excel(self, json_data, output_file):
        """
        将任意 JSON 数据中的键作为表头,值作为值,转换为 Excel 表格
        :param json_data: JSON 数据(字符串或字典)
        :param output_file: 输出的 Excel 文件路径
        """
        # 如果输入是 JSON 字符串,将其解析为字典
        data_list = None

        if isinstance(json_data, str):
            json_data = json.loads(json_data)

        # 找到 JSON 数据中的列表部分(假设是字典中的第一个值)
        if isinstance(json_data, dict):
            for key, value in json_data.items():
                if isinstance(value, list):  # 找到第一个值为列表的键
                    data_list = value
                    break
        elif isinstance(json_data, list):
            data_list = json_data
        else:
            raise ValueError("JSON 数据中未找到列表部分!")

        if data_list:
            # 将列表部分转换为 DataFrame
            df = pd.DataFrame(data_list)
            # 将 DataFrame 导出为 Excel 文件
            df.to_excel(output_file, index=False)
            print(f"Excel 文件已成功生成:{output_file}")
        else:
            print("Excel 文件生成失败")

三、完整运行流程

  1. 准备环境:安装所需库,并将需求文档(docx 文件)和 PaddleOCR 模型准备好。
  2. 提取图片:运行代码提取目标标题下的所有图片。
  3. 文字识别:使用 PaddleOCR 对图片进行文字识别,提取关键信息。
  4. 生成测试用例:调用大模型,基于提取的文字内容生成功能测试用例。
  5. 保存结果:将生成的测试用例保存到 Word 文档中,便于后续使用。

四、工具的实际应用场景

  1. 自动化用例生成:通过识别需求文档中的图片内容,快速生成对应的测试用例。
  2. 需求验证:结合图片中的文字内容和生成的测试用例,验证需求文档的完整性和准确性。
  3. 团队协作:将生成的测试用例文档分发给团队成员,提高工作效率。

五、小结

通过本文的工具实现,测试工程师可以将需求文档中的图片内容自动化处理,结合 PaddleOCR 和大模型生成高质量的功能测试用例。整个流程完全落地可用,适用于日常的测试用例生成需求,帮助测试工程师从重复性工作中解放出来,更专注于高价值的测试分析工作。

快试试这个工具,将测试效率提升到新高度吧!

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

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

相关文章

整形在内存中的存储(例题逐个解析)

目录 一.相关知识点 1.截断: 2.整形提升: 3.如何 截断,整型提升? (1)负数 (2)正数 (3)无符号整型,高位补0 注意:提升后得到的…

蓝牙系统的核心组成解析

一、硬件层:看得见的物理载体 1. 射频模块(Radio Frequency Module) 专业描述:工作在2.4GHz ISM频段,支持GFSK/π/4 DQPSK/8DPSK调制方式 功能类比:相当于人的"嘴巴"和"耳朵" 发射端…

uniapp笔记-底部和首部标签页菜单生成

逻辑 这些都是需要配置pages.json文件。 其中底部需要手动配置tarBar,如: "tabBar": {"list":[{"pagePath": "pages/index/index","text": "首页"},{"pagePath": "pages/…

SpringBoot 和vue前后端配合开发网页拼图10关游戏源码技术分享

今天分享一个 前后端结合 的网页游戏 开发项目源码技术。 这也是我第一次写游戏类的程序,虽然不是特别复杂的游戏,但是是第一次写,肯定要记录一下了,哈哈。 游戏的内容 就是 我们显示中玩的那个 拼图碎片的 游戏,类似下…

OpenCV计算摄影学(21)非真实感渲染之边缘保留滤波器edgePreservingFilter()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 滤波是图像和视频处理中的基础操作。边缘保留平滑滤波器被广泛应用于多种不同场景[98]。 cv::edgePreservingFilter 是一种边缘保留滤波器&#…

JVM并发编程AQSsync锁ReentrantLock线程池ThreadLocal

并发编程2 synchronized锁实现**AQS****ReentrantLock实现****JUC 常用类**池的概念 ThreadLocalThreadLocal原理内存泄露强引用:软引用弱引用虚引用ThreadLocal内存泄露 synchronized锁实现 synchronized是一个关键字,实现同步,还需要我们提供一个同步锁对象,记录锁状态,记录…

什么是数学建模?数学建模是将实际问题转化为数学问题

数学建模是将实际问题转化为数学问题,并通过数学工具进行分析、求解和验证的过程。 一、数学建模的基本流程 问题分析 • 明确目标:确定需要解决的核心问题。 • 简化现实:识别关键变量、忽略次要因素。 • 定义输入和输出:明确模…

唤起“队列”的回忆

又来博客记录自己的学习心得了,嘿嘿嘿(^~^) 目录 队列的概念和结构: 队列的创建和初始化: 队列入栈: 队列出栈: 队列的销毁: 取队头和队尾数据: 结语: 队列的概念…

Linux(8.4)NFS

文章目录 一、概念二、详解NFS1)软件名2)服务名3)配置文件4)端口号5)相关命令 三、部署NFS一、NFS服务端1)**配置源(本地或者网络源)**2)2、安装NFS**3)启动服…

【位运算】速算密钥:位运算探秘

文章目录 前言例题一、判定字符是否唯一二、丢失的数字三、两整数之和四、只出现⼀次的数字 II五、消失的两个数字 结语 前言 什么是位运算算法呢? 位运算算法是以位运算为核心操作,设计用来高效解决特定问题的一系列计算步骤集合。它巧妙利用位运算直接…

STM32G070CBT6读写FLASH中的数据

向FLASH中写入数据函数 /*函数说明:向FLASH中写数据形参:addr-要写入数据的起始地址 data-准备写入数据 len-数据大小返回值:1-成功,0-失败 */ uint8_t FlashWriteData(uint64_t addr,uint8_t data[],size_t len) {uint32_t Fir…

AD绘图基本操作

一、基本操作 注意:快捷键都要在英文模式下才能生效 1、移动 按住鼠标右键移动 2、切换桌面栅格距离 G 3、英寸和毫米 尺寸切换 Q 4、元件在3D模式下的移动 3D视角鼠标左键只起到选择元器件并移动之的功能, 单纯鼠标右键只能平移桌面 shift鼠…

dfs(十二)21. 合并两个有序链表 递归解决

21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4]示例 2: 输入:l1 [], l2 [] …

51单片机指令系统入门

目录 基本概念讲解 一、机器指令​ 二、汇编指令​ (一)汇编指令的一般格式 (二)按字节数分类的指令 三、高级指令 总结​ 基本概念讲解 指令是计算机(或单片机)中 CPU 能够识别并执行的基本操作命令…

安全无事故连续天数计算,python 时间工具的高效利用

安全天数计算,数据系统时间直取,安全标准高效便捷好用。 笔记模板由python脚本于2025-03-17 23:50:52创建,本篇笔记适合对python时间工具有研究欲的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值:在于输出思考与经验&am…

如何玩DeepSeek!15分钟快速创建GIS动态数据可视化仪表盘

DeepSeek最近火遍全球,大家用的都用的不亦乐乎。国外呢?当然也是,最近一上YouTube、X等都是deepseek的推送。 今天介绍一下,我在YouTube上看到的GIS行业与DeepSeek结合的一个案例: 快速轻松构建交互式地图仪表盘&…

课上测试:MIRACL共享库使用测试

MIRACL(MultiprecisionIntegerandRationalArithmeticC/cLibrary)是著名的密码算法库,设法去官网下载安装MIRACL,提交安装过程截图或过程文本(3分). 去github官网下载.zip文件 使用如下命令进行解压 unzip -j -aa -L MIRACL-mast…

网络编程知识预备阶段

1. OSI七层模型 OSI(Open System Interconnect)七层模型是一种将计算机网络通信协议划分为七个不同层次的标准化框架。每一层都负责不同的功能,从物理连接到应用程序的处理。这种模型有助于不同的系统之间进行通信时,更好地理解和…

STM32微控制器_03_GPIO原理与应用

核心内容 STM32 GPIO基本原理(熟悉)GPIO输出功能HAL库编程实现的应用(重点)GPIO输入功能HAL库编程实现的应用(重点) 一.STM32 GPIO基本原理 1.GPIO简介 STM32的GPIO相当于STM32的四肢,一个S…

零拷贝分析

kafka 零拷贝 请求 - 网口 - socket - 用户态 - 内核缓存区 - 内核态(磁盘信息) 磁盘 - 内核缓存区 - 用户缓存区 - 网络缓存区 零拷贝(Zero-Copy) 是一种高效的数据传输技术,旨在减少数据在内存中的拷贝次数&#x…