当前位置: 首页 > news >正文

如何使用分块策略生成高覆盖率测试用例:需求文档与接口文档的最佳实践

在前面分块文章中,只对需求文档的分块策略进行了设计,主要是固定长度+滑块进行分块。但在实际调试中发现,接口文档的分块会有所不同,如果采用与需求文档相同的方法,会导致接口内容切割到不同的块中,导致内容不完整,大模型返回的结果自然也不会完整。
下面详细来说明,在测试用例设计过程中,需求文档和接口文档是两类重要的输入来源。由于文档内容的长度和结构复杂性,直接处理文档可能导致信息丢失或模型生成结果不完整。本文将介绍如何为需求文档和接口文档选择合适的分块策略,重点实现针对接口文档(如 .xlsx.yml.json)的基于内容的分块方法,确保接口数据完整性。此外,还将说明如何选择日志文件的分块策略,并提供基于常用设计方法的提示词模板,帮助测试工程师快速生成高覆盖率的测试用例。


1. 需求文档与接口文档的分块差异性

1.1 需求文档的特点

  • 多为自然语言描述:需求文档通常包含功能说明、业务流程、边界条件等,以段落或标题为主。
  • 上下文关联强:文档内容之间存在较强的逻辑关联,适合按固定长度或滑动窗口分块,保证上下文连续性。
  • 分块目标:避免文本过长导致模型输入超限,同时保留逻辑连贯性。

1.2 接口文档的特点

  • 结构化内容为主:接口文档以接口定义为核心,包含接口名称、请求方法、URL、参数、响应格式等。
  • 接口独立性强:每个接口的定义相对独立,适合基于内容分块。
  • 分块目标:确保接口定义完整,避免将接口数据拆分到不同的块中。

1.3 分块策略总结

文档类型分块策略理由
需求文档固定长度分块 + 滑动窗口分块适合长文本,保留上下文逻辑,适合自然语言描述的需求文档。
接口文档基于内容分块接口独立性强,分块时保证接口定义完整。
日志文件固定长度分块日志通常为时间序列数据,按固定长度分块便于处理和分析。

2. 接口文档的基于内容分块实现

接口文档可能以不同格式(如 .xlsx.yml.json)提供,因此需要针对各类文档设计专属的分块方法,以保证接口定义的完整性。

2.1 分块目标

  • 保证每个接口的定义不被拆分到不同的块中。
  • 分块后每个块的大小尽可能接近模型的输入限制。

2.2 实现代码

2.2.1 处理 .xlsx 接口文档

.xlsx 文档通常包含表格形式的接口定义(包含列:接口名称、请求方法、URL、参数等)。以下代码实现基于内容分块:

import pandas as pd


def chunk_xlsx(file_path, max_chunk_size=1000):
    """
    将 .xlsx 接口文档按接口定义分块,确保接口数据完整。

    参数:
    - file_path (str): .xlsx 文件路径
    - max_chunk_size (int): 每个分块的最大字符数

    返回:
    - list: 分块后的接口定义列表
    """
    df = pd.read_excel(file_path)
    chunks = []
    current_chunk = ""
    current_size = 0

    for _, row in df.iterrows():
        row_content = row.to_json(force_ascii=False)  # 将行内容转换为 JSON 字符串
        row_size = len(row_content)

        if current_size + row_size > max_chunk_size:
            chunks.append(current_chunk)
            current_chunk = row_content
            current_size = row_size
        else:
            current_chunk += "\n" + row_content
            current_size += row_size
    if current_chunk:
        chunks.append(current_chunk)

    return chunks


if __name__ == '__main__':
    file_path = '接口文档.xlsx'
    chunk_result = chunk_xlsx(file_path)
    for chunk_ in chunk_result:
        print(chunk_)

示例excel接口文档如下图所示:

在这里插入图片描述

基于内容分块,可以在最大限度情况下,保证接口数据的完整性。运行效果如下图所示:
在这里插入图片描述


2.2.2 处理 .yml 接口文档

.yml 文档通常以缩进格式定义接口,以下代码按接口的根级块进行分割:

import yaml

def chunk_yaml(file_path, max_chunk_size=1000):
    """
    将 .yml 接口文档按接口定义分块,确保接口数据完整。

    参数:
    - file_path (str): .yml 文件路径
    - max_chunk_size (int): 每个分块的最大字符数

    返回:
    - list: 分块后的接口定义列表
    """
    with open(file_path, 'r', encoding='utf-8') as file:
        data = yaml.safe_load(file)

    chunks = []
    current_chunk = ""
    current_size = 0
    if isinstance(data, dict):
        for key, value in data.items():
            interface_content = yaml.dump({key: value})  # 将单个接口块转为字符串
            interface_size = len(interface_content)

            if current_size + interface_size > max_chunk_size:
                chunks.append(current_chunk)
                current_chunk = interface_content
                current_size = interface_size
            else:
                current_chunk += "\n" + interface_content
                current_size += interface_size
    elif isinstance(data, list):
        for data_ in data:
            for key, value in data_.items():
                interface_content = yaml.dump({key: value}, allow_unicode=True)  # 将单个接口块转为字符串
                interface_size = len(interface_content)

                if current_size + interface_size > max_chunk_size:
                    chunks.append(current_chunk)
                    current_chunk = interface_content
                    current_size = interface_size
                else:
                    current_chunk += "\n" + interface_content
                    current_size += interface_size

    if current_chunk:
        chunks.append(current_chunk)

    return chunks

if __name__ == '__main__':
    chunk_list = chunk_yaml('test_file.yml')
    for chunk in chunk_list:
        print(chunk)
        print('------------------')

yml文件示例:

在这里插入图片描述
根据内容分块的结果存在接口数据被切割在不同块中,仍需优化:
在这里插入图片描述


2.2.3 处理 .json 接口文档

对于 .json 接口文档,通常为接口定义的数组,可以按每个接口对象分块:

import json

def chunk_json(file_path, max_chunk_size=1000):
    """
    将 .json 接口文档按接口定义分块,确保接口数据完整。

    参数:
    - file_path (str): .json 文件路径
    - max_chunk_size (int): 每个分块的最大字符数

    返回:
    - list: 分块后的接口定义列表
    """
    with open(file_path, 'r', encoding='utf-8') as file:
        data = json.load(file)

    chunks = []
    current_chunk = ""
    current_size = 0

    for interface in data:
        interface_content = json.dumps(interface, indent=2, ensure_ascii=False)
        interface_size = len(interface_content)

        if current_size + interface_size > max_chunk_size:
            chunks.append(current_chunk)
            current_chunk = interface_content
            current_size = interface_size
        else:
            current_chunk += "\n" + interface_content
            current_size += interface_size

    if current_chunk:
        chunks.append(current_chunk)

    return chunks


if __name__ == '__main__':
    file_path = 'test345.json'
    chunk_list = chunk_json(file_path)
    for chunk_ in chunk_list:
        print('---------------------')
        print(chunk_)

json文件示例如下:
在这里插入图片描述
基于内容分块的结果如下,可以较好的将接口内容保留完整。

在这里插入图片描述


3. 日志文件的分块策略

日志文件通常是时间序列数据,适合使用 固定长度分块 策略。以下是实现代码:

def chunk_logs(file_path, lines_per_chunk=100):
    """
    将日志文件按行进行固定长度分块。

    参数:
    - file_path (str): 日志文件路径
    - lines_per_chunk (int): 每个分块的行数

    返回:
    - list: 分块后的日志内容列表
    """
    chunks = []
    current_chunk = []

    with open(file_path, 'r', encoding='utf-8') as file:
        for line in file:
            current_chunk.append(line.strip())
            if len(current_chunk) >= lines_per_chunk:
                chunks.append("\n".join(current_chunk))
                current_chunk = []

    if current_chunk:
        chunks.append("\n".join(current_chunk))

    return chunks

4. 提示词模板:基于设计方法的接口用例生成

为了设计高覆盖率的接口测试用例,以下是基于常用设计方法的提示词模板:

你是一名资深接口测试工程师,擅长通过多种测试设计方法生成高质量的接口测试用例。  
请根据提供的接口文档设计测试用例,要求如下:  

1. **正交分析法**:  
- 使用正交表生成参数组合,覆盖所有交互组合。  

2. **边界值分析**:  
- 针对接口参数,测试极值(最小值、最大值、略大于/小于边界值)。  

3. **等价类划分**:  
- 将参数划分为有效类和无效类,覆盖每个等价类。  

4. **状态转换法**:  
- 测试接口的状态变化,包括合法和非法状态转换。  

5. **输出要求**:  
- 格式:JSON  
- 字段:`case_id`, `case_name`, `priority`, `pre_condition`, `steps`, `expected_result`, `test_data`, `test_type`  
- 提供至少 5 个测试用例,覆盖正常情况、异常情况和边界情况。  

5. 总结

  1. 需求文档与接口文档的分块差异

    • 需求文档适合固定长度分块和滑动窗口分块,保证逻辑连贯性。
    • 接口文档适合基于内容分块,确保接口定义完整。
  2. 实现代码

    • 提供了 .xlsx.yml.json 接口文档的基于内容分块代码。
    • 日志文件采用固定长度分块,便于时间序列分析。
  3. 高覆盖率提示词

    • 基于正交分析法、边界值分析等常用方法设计测试用例,确保覆盖率高。

通过本文的策略和代码,测试工程师可以更高效地处理长文档内容,设计出高质量的接口测试用例。基于分块策略的优化,将对Deepseek API+Python 测试用例一键生成与导出小工具进行优化。希望可以取得较好的效果~加油

相关文章:

  • 力扣125.验证回文串
  • 标题:Linux系统文件句柄优化全攻略:彻底解决“Too Many Open Files”错误
  • 【算法竞赛】动态规划+记忆化搜索(作物杂交问题)
  • 31天Python入门——第18天:面向对象三大特性·封装继承多态
  • nacos 2.x使用java语言实现自定义Loadbalance
  • 了解可观察性指标:类型、黄金信号和最佳实践
  • SpringBoot框架—classpath、Bean、容器的概念
  • 【Text2reward】code_generation/single_flow/results/gpt-4-0331/maniskill-zeroshot
  • 私有知识库 Coco AI 实战(一):Linux 平台部署
  • LabVIEW 开发中 TCP 与 UDP 协议的差异
  • 《晶振:时空节拍的契约者》
  • 业级无线监控技术解决方案:巨控GRM240 4G PLC无线通讯模块
  • 【MVC简介-产生原因、演变历史、核心思想、使用场景】
  • 有哪些开源的视频生成模型
  • [Windows] Escrcpy-1.29.2
  • 【测试】每日3道面试题 3/31
  • demo.launch(inbrowser=True, share=True)无法生成共享网址
  • 【力扣hot100题】(028)删除链表的倒数第N个节点
  • [C++] : C++11 右值引用的理解
  • Vue 2 和 Vue 3 有什么区别
  • 如何能让企业做网站的打算/合肥网站推广公司排名
  • 电脑网站 源码/深圳seo优化排名优化
  • 武汉网页平面设计/网站推广与优化平台
  • 关于百度网站的优缺点/南京seo公司教程
  • hois.skxy.wordpress/seo分析案例
  • 合肥外贸网站建设/推广赚钱的平台有哪些