让AI帮我做测试用例,我来喝咖啡

0 阅读27分钟

一、项目背景

1.1 问题痛点

在软件测试领域,测试用例的编写是一项耗时且繁琐的工作。传统的测试用例编写方式存在以下问题:

  • 依赖人工经验:测试用例的质量高度依赖测试工程师的业务理解能力和经验水平
  • 编写效率低下:针对一个功能模块,往往需要花费数小时甚至数天时间编写测试用例
  • 覆盖不全面:容易遗漏边界条件、异常场景等重要测试点
  • 文档同步困难:需求文档变更后,测试用例需要同步更新,容易产生不一致

1.2 解决方案

随着大语言模型(LLM)技术的快速发展,我们可以利用 AI 技术来辅助测试用例的编写。然而,仅仅依靠大语言模型和业务需求文档是不够的,因为:

  • 大语言模型缺乏领域专业知识:通用大模型对特定业务领域的测试规则、边界条件、异常场景等了解有限
  • 测试经验难以传承:资深测试工程师的经验和技巧往往难以系统化地传授给新人
  • 测试质量参差不齐:不同测试工程师编写的测试用例质量差异较大,缺乏统一的标准

为了解决这些问题,本项目创新性地引入了**测试技能库(Skill)**作为核心组件,结合以下三大技术,实现了从需求文档自动生成高质量测试用例的功能:

  1. RAG(检索增强生成)技术:通过向量数据库检索相关的业务需求文档
  2. 测试技能库(Skill):构建领域特定的测试方法论和最佳实践库,这是本项目的核心创新
  3. 大语言模型:基于需求上下文和测试技能,生成高质量的测试用例

测试技能库的核心价值

测试技能库是连接业务需求和高质量测试用例的桥梁,它的重要性体现在:

  1. 经验沉淀:将资深测试工程师多年积累的测试经验、方法论、最佳实践系统化地沉淀下来,形成可复用的知识资产
  2. 质量保障:确保生成的测试用例遵循统一的测试标准,覆盖关键的测试场景(正向流程、边界条件、异常处理、安全验证等)
  3. 效率提升:新人可以通过技能库快速上手,无需从头学习所有测试规则
  4. 持续演进:技能库可以随着业务发展和测试经验的积累不断更新和完善
  5. 领域适配:针对不同的业务领域(如优惠券、营销活动、支付安全等),可以构建专门的测试技能库

通过测试技能库,我们实现了"业务需求 + 测试技能 = 高质量测试用例"的完整闭环,这是本项目区别于其他普通测试用例生成工具的核心竞争力。

二、实现思路

2.1 整体架构

工具采用模块化设计,主要包含以下核心模块:

  1. 文档处理模块:负责多格式文档的解析和文本提取
  2. 向量数据库模块:负责文档的向量化存储和相似度检索
  3. 测试技能库(Skill):存储领域特定的测试方法论和最佳实践
  4. 测试用例生成模块:结合业务需求和测试技能,生成高质量测试用例
  5. UI 交互模块:提供友好的 Web 界面供用户操作

2.2 核心技术栈

  • 后端框架:FastAPI + Uvicorn
  • 前端框架:Gradio
  • 向量数据库:ChromaDB
  • 文档处理:pdfplumber、python-docx、pandas、BeautifulSoup4
  • 大语言模型:支持模型切换(百炼/自定义),内置百炼(DashScope)通义千问系列模型
  • 编程语言:Python 3.8+

2.3 工作流程

工具启动,加载测试技能库(Skill)
    ↓
用户上传需求文档 
    ↓
文档格式转换(提取纯文本)
    ↓
文档向量化(业务需求 + 测试技能)
    ↓
用户输入测试需求
    ↓
向量相似度检索(同时检索业务需求和相关测试技能)
    ↓
智能融合(业务需求优先,测试技能补充)
    ↓
大语言模型生成高质量测试用例
    ↓
结果展示(Markdown/表格视图)

关键环节说明

  1. 技能库预加载:工具启动时自动加载所有测试技能文件到向量数据库
  2. 双重检索:生成测试用例时,同时检索业务需求文档和相关的测试技能
  3. 智能融合:优先使用业务需求作为测试依据,使用测试技能补充边界、异常、安全、兼容性等场景
  4. 质量保障:通过测试技能库确保生成的测试用例遵循最佳测试实践

三、过程解析

3.1 向量数据库管理:单例模式实现

为了确保向量数据库的全局唯一性和线程安全,我们采用了单例模式来管理向量数据库实例。

# rag_skills_testcase/core/vector_store.py
class VectorDBManager:
    """向量数据库管理器,使用单例模式"""

    _instance = None
    _lock = threading.Lock()

    def __new__(cls, config, embedding_model):
        with cls._lock:
            if cls._instance is None:
                cls._instance = super(VectorDBManager, cls).__new__(cls)
                cls._instance._initialize(config, embedding_model)
            elif cls._instance.config != config or cls._instance.embedding_model != embedding_model:
                # 如果配置或嵌入模型发生变化,重新初始化
                cls._instance._initialize(config, embedding_model)
        return cls._instance

    def get_or_init(self, force_rebuild: bool = False):
        with self._instance_lock:
            if self._loading:
                logger.info(" VectorDB is still loading...")
                return None
            if not force_rebuild and self._db is not None:
                return self._db
            try:
                self._loading = True
                self._db = init_vector_db_internal(self.config, self.embedding_model, force_rebuild)
                self._initialized = True
                return self._db
            finally:
                self._loading = False

设计要点

  • 使用双重检查锁定(Double-Checked Locking)确保线程安全
  • 支持配置和嵌入模型变更时的重新初始化
  • 添加了加载状态检查,防止重复加载

3.2 测试技能库(Skill):沉淀测试专家经验

测试技能库是本工具的核心创新之一,它将测试专家的经验沉淀为可复用的知识,确保生成的测试用例既符合业务需求,又遵循最佳测试实践。

3.2.1 技能库结构

测试技能库采用分层设计,包含以下三个主要分类:

test_skills/
├── general/                    # 通用测试技能
│   ├── boundary_value_examples.md      # 边界值与异常输入测试技能
│   └── error_code_validation_guide.md  # 错误码与异常处理测试技能
├── domain_specific/          # 领域特定测试技能
│   ├── coupon_test_skills.md        # 优惠券功能测试技能
│   ├── login_test_scenarios.md    # 登录功能测试技能
│   ├── marketing_activity_test_skills.md  # 营销活动通用测试技能
│   ├── payment_security_checklist.md  # 支付安全测试技能
│   └── marketing_activities/   # 营销活动子目录
│       ├── full_discount_activity.md  # 满减满折活动测试技能
│       ├── order_discount_activity.md # 联单折扣活动测试技能
│       └── ...                  # 其他活动测试技能
└── platform/                 # 平台相关测试技能
    └── mini_program_compatibility.md  # 小程序兼容性测试技能

3.2.2 技能文件内容结构

每个技能文件都遵循统一的格式,包含以下内容:

  • 标题:技能名称
  • 基本规则:领域特定的业务规则和约束条件
  • 测试要点:详细的测试点和要求
  • 测试用例示例:具体的测试步骤和预期结果

以优惠券功能测试技能为例:

# 优惠券功能测试技能

## 0. 优惠券基本规则

### 核心规则
- 优惠券按照类型分红包券、优惠券
- 优惠券业务逻辑:创建券->发放券->用户手动领取/自动发放->用户使用
- 未支付退券逻辑:用户用券下单提交订单未支付,用户取消,优惠券原路返回到用户优惠券列表
- ...

## 1. 创建券功能测试
### 创建规则
- 券类型选择:红包券、优惠券
- 券名称:最长10个字
- 有效期:结束时间必须大于开始时间,大于系统当前时间
- ...

### 测试要点
- 验证券名称长度限制
- 验证有效期逻辑
- 验证优惠类型选择
- ...

3.2.3 技能库与业务需求的协同工作

测试技能库与业务需求文档协同工作的方式:

  1. 加载技能库:工具启动时自动加载所有技能文件到向量数据库,标记 `type: "skill"

  2. 加载业务需求:用户上传的业务需求文档标记 `type: "business"

  3. 联合检索:生成测试用例时,同时检索业务需求和相关测试技能

  4. 智能融合

    • 优先使用业务需求作为测试依据
    • 使用测试技能补充边界、异常、安全、兼容性等场景
    • 严禁将测试技能中未在业务需求提及的功能当作需求生成用例

3.2.4 设计要点

  • 分层设计:通用技能、领域特定技能、平台相关技能三层结构清晰
  • 可扩展性:易于添加新的测试技能文件
  • 版本管理:支持技能库的持续更新和完善
  • metadata标记:通过 type 字段区分业务需求和测试技能
  • 权重控制:业务需求优先,测试技能补充,避免编造需求

3.2.5 技能库的实际应用效果

测试技能库在实际应用中展现出显著的价值,具体体现在以下几个方面:

1. 测试用例质量显著提升

  • 边界条件覆盖更全面:通过通用技能中的边界值测试方法,自动生成边界值、异常值等测试用例
  • 异常场景考虑更周全:基于测试技能中的异常处理测试要点,确保覆盖各种异常情况
  • 测试场景更系统化:遵循技能库中的测试方法论,生成的测试用例逻辑更清晰、结构更完整

2. 测试用例生成效率大幅提高

  • 减少重复劳动:新人无需从头学习所有测试规则,可以直接复用技能库中的经验
  • 缩短学习曲线:通过技能库,新人可以快速了解特定领域的测试要点
  • 提高一致性:不同测试工程师生成的测试用例风格统一、标准一致

3. 领域知识的持续积累

  • 经验传承:资深测试工程师的经验可以通过技能库传承给团队成员
  • 知识沉淀:随着项目发展,技能库会不断丰富和完善
  • 最佳实践固化:将经过验证的测试方法和技巧固化到技能库中

3.2.6 使用 Skill 的好处

使用测试技能库后,可以带来以下显著好处:

1. 测试用例质量显著提升

  • 系统覆盖正向流程、边界条件、异常场景、安全验证等关键测试点
  • 确保测试用例遵循统一的测试标准和最佳实践
  • 测试用例质量稳定,不依赖个人能力

2. 测试经验系统化沉淀

  • 将资深测试工程师的经验、方法论、最佳实践系统化地沉淀下来
  • 形成可复用的知识资产,实现测试经验的传承
  • 技能库可以随着业务发展和测试经验的积累不断更新和完善

3. 大幅提高测试效率

  • 减少重复劳动,相同的测试规则无需反复考虑
  • 新人可以通过技能库快速上手,无需从头学习所有测试规则
  • 不同测试工程师生成的测试用例风格统一、标准一致
  • 可以规模化应用,提高整体测试效率

4. 领域知识持续积累

  • 针对不同的业务领域(如优惠券、营销活动、支付安全等),可以构建专门的测试技能库
  • 随着项目发展,技能库会不断丰富和完善
  • 将经过验证的测试方法和技巧固化到技能库中

3.2.7 与传统测试方法的对比

维度传统测试方法基于技能库的智能测试方法
经验依赖高度依赖测试工程师个人经验经验沉淀为可复用的技能库
测试质量质量参差不齐,依赖个人能力质量稳定,遵循统一标准
覆盖全面性容易遗漏边界和异常场景系统覆盖正向、边界、异常等场景
新人上手需要长时间学习和积累通过技能库快速上手
知识传承依赖言传身教,容易流失系统化沉淀,持续积累
效率重复劳动多,效率低自动化生成,效率高

3.2.8 技能库的建设方法论

建设高质量的测试技能库需要遵循一定的方法论:

1. 分层建设策略

  • 先通用后特定:先建设通用测试技能,再逐步扩展到特定领域
  • 从简单到复杂:从基础的测试要点开始,逐步完善和深化
  • 迭代优化:根据实际使用效果持续优化和完善技能库

2. 技能文件编写规范

  • 结构清晰:每个技能文件遵循统一的结构(基本规则、测试要点、测试用例示例)
  • 内容实用:技能内容要贴近实际测试工作,具有可操作性
  • 示例丰富:提供具体的测试用例示例,便于理解和参考

3. 持续维护和更新

  • 定期评审:定期评审技能库内容,确保时效性和准确性
  • 用户反馈:收集用户反馈,持续改进技能库
  • 版本管理:记录技能库的变更历史,支持版本回滚

4. 团队协作建设

  • 共建共享:鼓励团队成员共同参与技能库建设
  • 知识分享:定期组织技能库分享和学习活动
  • 激励机制:建立激励机制,鼓励贡献高质量的测试技能

通过以上方法论,可以建设一个高质量、可持续发展的测试技能库,为测试用例生成提供强大的支撑。

3.4 RAG 检索:相似度搜索与文档过滤

在生成测试用例之前,我们需要从向量数据库中检索与用户查询相关的文档片段,为大语言模型提供上下文。

# rag_skills_testcase/core/test_case_generator.py
def generate_cases_with_context(config: dict, vector_db, query: str, min_case_count: int = 10, max_case_count: int = 20) -> Tuple[str, str]:
    # 相似度搜索
    docs = vector_db.similarity_search(query, k=10)

    # 去重处理
    seen_sources = set()
    unique_docs = []
    for doc in docs:
        src = doc.metadata.get("source", "")
        if src:
            if src in seen_sources: continue
            seen_sources.add(src)
        unique_docs.append(doc)
        if len(unique_docs) >= 6: break

    # 文档分类:业务需求 vs 测试技能
    business_docs = [d for d in unique_docs if d.metadata.get("type") == "business"]
    skill_docs = [d for d in unique_docs if d.metadata.get("type") == "skill"]
    selected_docs = business_docs[:4] + skill_docs[:2]

设计要点

  • 使用 similarity_search 进行相似度检索
  • 按文档来源去重,避免重复内容
  • 区分业务需求文档和测试技能文档,分别检索
  • 限制上下文数量,避免超过 Token 限制

3.5 提示词工程:结构化测试用例生成

为了让大语言模型生成高质量、结构化的测试用例,我们设计了详细的提示词。

SYSTEM_PROMPT = "你是一名资深 QA 工程师,请基于以下【需求上下文】和【测试目标】,生成结构化、可执行的测试用例。"

IMPORTANT_NOTES = """ 重要说明:
    - 内容中标有 “[业务需求]” 的是本次需求描述,请严格以此为准。
    - 内容中标有 “[测试技能]” 的是通用测试方法论,请用于补充边界、异常、安全、兼容性等场景。
    - **严禁**将 [测试技能] 中未在 [业务需求] 提及的功能当作需求生成用例!
    - **如果[业务需求] 中未匹配到本次需求,则认定是功能回归,匹配[测试技能]中相关场景生成用例 """

REQUIREMENTS = """ 严格要求:
    1. 每条用例必须包含以下字段:
    - "id": 用例编号,格式为 TC_模块缩写_序号(如 TC_BARGAIN_01)
    - "module": 测试模块名称(如“砍价活动”、“满减活动”)
    - "title": 测试标题(≤20字,简明描述目的)
    - "precondition": 前置条件(若无则写“无”)
    - "steps": 操作步骤列表(≥2步,每步为字符串,如“1. 打开页面”)
    - "expected": 预期结果(明确、可验证)
    2. 必须覆盖以下场景(仅当需求上下文提及对应关键词时才生成):
    - 正向主流程(必选)
    - 异常/边界输入(如需求提到“输入框”“金额”等)
    - 登录状态:若需求提到“登录”“检查是否登录”“调起登录”,必须覆盖 → 未登录、已登录、登录失败
    - 跳转验证:若需求提到“跳转”“进入页面”“点击进入”,必须验证目标页面是否正确
    - 多端标注:若涉及“小程序”“H5”“APP”,在 title 或 steps 中明确标注(如“[小程序] 点击...”)
    3. 严禁编造需求未提及的功能(如需求未提“支付”,不可生成支付用例)
    4. 若【需求上下文】完全不涉及【测试目标】,请返回:{"error": "未找到相关需求内容"}"""

OUTPUT_SPEC = f""" 输出规范:
    - 生成 {case_count} 条高质量用例,宁缺毋滥
    - 输出为 **纯 JSON 列表**,无任何额外文字、注释、前缀、后缀或 Markdown
    - 字段顺序不限,但必须包含上述 6 个字段
    - 使用标准中文标点,禁止英文冒号"""

设计要点

  • 明确区分业务需求和测试技能的用途
  • 详细规定测试用例的字段和格式
  • 列出必须覆盖的测试场景(条件触发式)
  • 严格要求输出格式为纯 JSON 列表

3.6 多格式文档处理:HTML 解析与噪声过滤

项目支持多种格式的文档,包括 HTML、PDF、Word、Excel 等。对于 HTML 文档,我们实现了智能的文本提取和噪声过滤。

# rag_skills_testcase/scripts/convert_docs_to_txt.py
def _remove_noise_tags(soup):
    """移除HTML中的噪声标签"""
    # 移除脚本和样式标签
    for tag in soup(["script", "style"]):
        tag.decompose()

    # 移除box相关的元素(避免提取box上的文字)
    for tag in soup.find_all(class_=re.compile(r'box', re.IGNORECASE)):
        tag.decompose()
    for tag in soup.find_all(id=re.compile(r'box', re.IGNORECASE)):
        tag.decompose()

    # 处理注释
    for comment in soup.find_all(string=lambda text: isinstance(text, Comment)):
        comment.extract()

    return soup

设计要点

  • 移除 <script><style> 标签
  • 智能过滤 box 相关的 UI 元素
  • 移除 HTML 注释
  • 支持多种输出格式(plain、markdown、hybrid)

3.7 文件上传:支持文件夹和混合上传

为了方便用户上传整个项目的文档,我们实现了支持文件、文件夹及混合上传的功能。

# rag_skills_testcase/ui/gradio_app.py
def handle_upload(files, folder_files, folder_name, output_format):
    """处理文件上传"""
    # 重置文件夹前缀
    global current_folder_prefix
    current_folder_prefix = None

    # 合并文件和文件夹上传
    all_files = []
    if files:
        all_files.extend(files if isinstance(files, list) else [files])
    if folder_files:
        all_files.extend(folder_files if isinstance(folder_files, list) else [folder_files])

    # 生成文件夹前缀
    if len(all_files) > 0:
        if folder_name:
            current_folder_prefix = sanitize_filename(folder_name)
        else:
            timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
            current_folder_prefix = f"upload_{timestamp}"

    # 过滤以下划线开头的文件
    for file_obj in all_files:
        filename = os.path.basename(file_obj.name)
        if filename.startswith('_'):
            skipped.append(filename)
            continue

设计要点

  • 支持两个独立的上传组件(文件和文件夹)
  • 允许用户自定义文件夹名称
  • 自动过滤以下划线开头的文件和浏览器测试文件
  • 保持原有的文件夹结构

3.8 大模型集成平台:支持灵活切换

为了满足不同用户的需求,我们实现了大模型集成平台,支持多种模型提供商的切换。

# rag_skills_testcase/llm_client.py
def call_llm(prompt: str, config: dict, proxies=None) -> str:
    llm_cfg = config["llm"]
    provider = llm_cfg["provider"]

    if provider == "bailian":
        bailian = llm_cfg["bailian"]
        resp = Generation.call(
            model=bailian["model"],
            messages=[{"role": "user", "content": prompt}],
            temperature=bailian["temperature"],
            max_tokens=bailian["max_tokens"],
            result_format="message",
            proxies=proxies
        )
        # ... 省略其他代码 ...

    elif provider == "custom":
        custom = llm_cfg["custom"]
        # ... 自定义模型调用 ...

UI 动态显示/隐藏

# rag_skills_testcase/ui/gradio_app.py
def update_model_options(provider):
    """根据选择的模型提供商更新模型选项的可见性"""
    if provider == "bailian":
        return gr.update(visible=True), gr.update(visible=False), gr.update(visible=False)
    else:
        return gr.update(visible=False), gr.update(visible=True), gr.update(visible=True)

设计要点

  • 支持两种模型提供商:百炼(bailian)和自定义(custom)
  • 内置百炼通义千问系列模型:qwen-max、qwen-plus、qwen-turbo
  • 支持自定义模型配置:模型名称、API地址、温度、最大Token数
  • UI 动态显示/隐藏:选择不同提供商时显示对应配置选项,提升用户体验
  • 统一的调用接口:不同模型提供商使用相同的调用接口,便于扩展

四、实现效果

4.1 功能特性

  1. 测试技能库(Skill)

    • 分层设计:通用技能、领域特定技能、平台相关技能
    • 内置优惠券、登录、营销活动等多个领域的测试技能
    • 支持技能库的持续更新和扩展
    • 智能融合业务需求和测试技能,生成高质量测试用例
  2. 大模型集成平台

    • 支持模型提供商切换(百炼/自定义)
    • 内置百炼(DashScope)通义千问系列模型(qwen-max、qwen-plus、qwen-turbo)
    • 支持自定义模型配置(模型名称、API地址)
    • UI动态显示/隐藏:选择不同提供商时显示对应配置选项
  3. 多格式文档支持:支持 .txt.pdf.docx.doc.html.md.xmind.rp.ppt.pptx.xlsx.xls 等多种格式

  4. 智能文档解析:自动提取文档中的关键信息,支持多层级文本提取和噪声过滤

  5. 向量数据库:使用 ChromaDB 构建向量数据库,实现高效的相似度搜索

  6. 测试用例生成:基于 RAG 技术,结合文档内容和用户需求,生成结构化的测试用例

  7. 多视图展示:支持 Markdown 视图和表格视图,方便查看和管理测试用例

  8. Excel 导出:支持将生成的测试用例导出为 Excel 格式

  9. 文件夹上传:支持上传整个文件夹,保持原有文件夹结构

4.2 用户体验

  • 直观的 Web 界面,操作简单直观
  • 实时状态反馈,上传、转换、加载等操作都有明确的提示
  • 响应式设计,适配不同屏幕尺寸
  • 支持自定义测试用例数量范围
  • 表格视图和 Markdown 视图自由切换

4.3 测试用例示例

以下是基于业务需求和测试技能库生成的测试用例示例:

4.3.1 登录功能测试用例示例

测试场景:用户手机号验证码登录

  1. 正向流程测试

    • 输入正确的手机号和验证码,点击登录
    • 验证登录成功,跳转到首页
  2. 边界条件测试

    • 手机号为空时点击登录
    • 验证码为空时点击登录
    • 手机号格式不正确(10位、12位等)
    • 验证码长度不足或超过6位
  3. 异常场景测试

    • 手机号未注册时点击登录
    • 验证码错误时点击登录
    • 验证码过期时点击登录
    • 验证码已使用时点击登录
  4. 安全测试

    • 频繁发送验证码,验证是否有发送频率限制
    • 输入特殊字符的手机号
    • SQL注入尝试
    • XSS攻击尝试

4.3.2 优惠券测试用例示例

测试场景:满50减10优惠券领取和使用

用例编号测试类型测试描述前置条件测试步骤预期结果
正向流程
TC001正向流程正常领取优惠券用户已登录且未领取过该优惠券1. 进入优惠券活动页面
2. 点击"领取优惠券"按钮
1. 领取成功
2. 用户优惠券列表中新增该优惠券
TC002正向流程正常使用优惠券用户已领取满50减10优惠券1. 添加商品,订单总金额60元
2. 选择该优惠券
3. 提交订单
1. 订单金额自动扣减10元
2. 实际支付50元
3. 优惠券状态变为已使用
边界条件
TC003边界条件订单金额恰好等于满减门槛用户已领取满50减10优惠券1. 添加商品,订单总金额50元
2. 选择该优惠券
3. 提交订单
1. 订单金额自动扣减10元
2. 实际支付40元
3. 优惠券状态变为已使用
TC004边界条件订单金额比满减门槛少1元用户已领取满50减10优惠券1. 添加商品,订单总金额49元
2. 选择该优惠券
3. 提交订单
1. 提示"订单金额不满足优惠券使用条件"
2. 优惠券无法使用
3. 订单金额保持不变
TC005边界条件订单金额为0元(仅使用优惠券)用户已领取满50减10优惠券1. 不添加任何商品
2. 选择该优惠券
3. 提交订单
1. 提示"订单金额不满足优惠券使用条件"
2. 优惠券无法使用
异常场景
TC006异常场景优惠券已过期用户已领取满50减10优惠券且优惠券已过期1. 添加商品,订单总金额60元
2. 选择该过期优惠券
3. 提交订单
1. 提示"优惠券已过期"
2. 优惠券无法使用
3. 订单金额保持不变
TC007异常场景优惠券已使用用户已使用过该优惠券1. 添加商品,订单总金额60元
2. 选择该优惠券
3. 提交订单
1. 提示"优惠券已使用"
2. 优惠券无法使用
3. 订单金额保持不变
TC008异常场景用户未登录时领取优惠券用户未登录1. 进入优惠券活动页面
2. 点击"领取优惠券"按钮
1. 跳转到登录页面
2. 提示"请先登录"
TC009异常场景优惠券已被抢光优惠券库存为01. 进入优惠券活动页面
2. 点击"领取优惠券"按钮
1. 提示"优惠券已被抢光"
TC010异常场景用户超过领取次数限制用户已领取过该优惠券且达到最大领取次数1. 进入优惠券活动页面
2. 点击"领取优惠券"按钮
1. 提示"已达到最大领取次数"
叠加规则
TC011叠加规则优惠券与其他促销活动同时使用用户已领取满50减10优惠券且商品正在参与8折活动1. 添加商品,原价100元
2. 商品享受8折后为80元
3. 选择该优惠券
4. 提交订单
1. 先计算折扣:100元 × 0.8 = 80元
2. 再使用优惠券:80元 - 10元 = 70元
3. 实际支付70元
TC012叠加规则优惠券与多件折扣同时使用用户已领取满50减10优惠券且有"满2件9折"活动1. 添加2件商品,每件原价50元
2. 订单原价100元
3. 先享受满2件9折:100元 × 0.9 = 90元
4. 再使用优惠券:90元 - 10元 = 80元
5. 提交订单
1. 实际支付80元
2. 优惠券状态变为已使用
安全测试
TC013安全测试尝试修改优惠券金额(前端篡改)用户已领取满50减10优惠券1. 通过浏览器开发者工具修改优惠券金额为满50减100
2. 添加商品,订单总金额60元
3. 选择该优惠券
4. 提交订单
1. 后端验证优惠券金额
2. 提示"优惠券信息异常"
3. 订单金额保持不变
TC014安全测试尝试重复领取优惠券(并发请求)用户已登录且未领取过该优惠券1. 同时发送10个领取优惠券的请求1. 只有1个请求成功领取优惠券
2. 其他9个请求失败
3. 用户优惠券列表中只有1张该优惠券
TC015安全测试SQL注入尝试用户已登录1. 在优惠券活动页面URL中注入SQL语句1. 系统过滤非法输入
2. 页面正常显示或跳转到错误页面
兼容性测试
TC016兼容性测试在H5页面领取优惠券用户已登录且使用H5页面1. 在H5页面进入优惠券活动页面
2. 点击"领取优惠券"按钮
1. 领取成功
2. 用户优惠券列表中新增该优惠券
TC017兼容性测试在小程序中使用优惠券用户已登录且使用小程序1. 在小程序中添加商品,订单总金额60元
2. 选择该优惠券
3. 提交订单
1. 订单金额自动扣减10元
2. 实际支付50元
3. 优惠券状态变为已使用
未支付退券
TC018未支付退券订单未支付取消后优惠券退回用户已领取满50减10优惠券1. 添加商品,订单总金额60元
2. 选择该优惠券
3. 提交订单但未支付
4. 取消订单
1. 优惠券状态变为可使用
2. 用户优惠券列表中可以看到该优惠券
TC019未支付退券订单支付后取消不退还优惠券用户已领取满50减10优惠券1. 添加商品,订单总金额60元
2. 选择该优惠券
3. 提交订单并支付
4. 申请退款
1. 订单退款成功
2. 优惠券状态保持已使用
3. 优惠券不退回

五、实践成果

  • 基于业务技能库:仅依赖业务技能库生成时,生成的测试用例采纳率可达60%以上,这要求业务技能(Skills)具备清晰的功能结构划分和逻辑描述,以提升检索准确度。
  • 基于产品需求文档:基于产品需求文档生成时,文档结构化难度较大,生成的用例偏离度较高,当前需人工介入对产品需求文档进行结构化处理后再向量化,功能上虽已支持 hybrid、纯文本、Markdown 等转换类型选择,但效果有待进一步验证。
  • 使用建议:不同的测试场景、不同的业务领域,生成效果会有差异,需要根据具体情况选择合适的输入方式,并结合人工评审和调整,才能达到最佳效果。

六、未来规划

6.1 功能增强

  1. 支持更多文档格式

    • 添加对思维导图格式(XMind、MindManager)的更好支持
    • 添加对 Markdown 数学公式和流程图的支持
  2. 测试技能库优化

    • 支持技能库的在线编辑和管理
    • 添加技能库的版本管理和回滚功能
    • 支持技能库的分类和标签管理
    • 添加技能库的搜索和推荐功能
    • 支持从生成的测试用例中自动学习和提取新的测试技能
  3. 测试用例质量优化

    • 引入测试用例评审机制,支持用户反馈和修正
    • 添加测试用例覆盖率分析功能
    • 支持测试用例的版本管理和回溯
  4. 团队协作功能

    • 支持多用户协作
    • 添加测试用例库的分享和复用功能
    • 支持测试用例的评论和讨论

6.2 技术优化

  1. 向量数据库优化

    • 引入向量索引缓存机制
    • 支持增量更新向量索引
    • 优化相似度检索算法,提高检索准确性
  2. 大语言模型集成

    • 支持更多大语言模型(OpenAI、Claude、本地模型等)
    • 添加模型对比和 A/B 测试功能
    • 优化提示词,提高生成质量和稳定性
  3. 前端交互优化

    • 将Gradio替换为更专业的前端框架(如React、Vue、Next.js等)
    • 提供更好的用户交互体验和视觉效果
    • 支持更复杂的界面布局和组件
    • 实现更流畅的动画和过渡效果
  4. 工具性能优化

    • 引入异步处理,提高并发能力
    • 添加任务队列,支持后台处理
    • 优化内存使用,支持处理更大的文档

作者:洞窝-延君