一、项目背景
1.1 问题痛点
在软件测试领域,测试用例的编写是一项耗时且繁琐的工作。传统的测试用例编写方式存在以下问题:
- 依赖人工经验:测试用例的质量高度依赖测试工程师的业务理解能力和经验水平
- 编写效率低下:针对一个功能模块,往往需要花费数小时甚至数天时间编写测试用例
- 覆盖不全面:容易遗漏边界条件、异常场景等重要测试点
- 文档同步困难:需求文档变更后,测试用例需要同步更新,容易产生不一致
1.2 解决方案
随着大语言模型(LLM)技术的快速发展,我们可以利用 AI 技术来辅助测试用例的编写。然而,仅仅依靠大语言模型和业务需求文档是不够的,因为:
- 大语言模型缺乏领域专业知识:通用大模型对特定业务领域的测试规则、边界条件、异常场景等了解有限
- 测试经验难以传承:资深测试工程师的经验和技巧往往难以系统化地传授给新人
- 测试质量参差不齐:不同测试工程师编写的测试用例质量差异较大,缺乏统一的标准
为了解决这些问题,本项目创新性地引入了**测试技能库(Skill)**作为核心组件,结合以下三大技术,实现了从需求文档自动生成高质量测试用例的功能:
- RAG(检索增强生成)技术:通过向量数据库检索相关的业务需求文档
- 测试技能库(Skill):构建领域特定的测试方法论和最佳实践库,这是本项目的核心创新
- 大语言模型:基于需求上下文和测试技能,生成高质量的测试用例
测试技能库的核心价值
测试技能库是连接业务需求和高质量测试用例的桥梁,它的重要性体现在:
- 经验沉淀:将资深测试工程师多年积累的测试经验、方法论、最佳实践系统化地沉淀下来,形成可复用的知识资产
- 质量保障:确保生成的测试用例遵循统一的测试标准,覆盖关键的测试场景(正向流程、边界条件、异常处理、安全验证等)
- 效率提升:新人可以通过技能库快速上手,无需从头学习所有测试规则
- 持续演进:技能库可以随着业务发展和测试经验的积累不断更新和完善
- 领域适配:针对不同的业务领域(如优惠券、营销活动、支付安全等),可以构建专门的测试技能库
通过测试技能库,我们实现了"业务需求 + 测试技能 = 高质量测试用例"的完整闭环,这是本项目区别于其他普通测试用例生成工具的核心竞争力。
二、实现思路
2.1 整体架构
工具采用模块化设计,主要包含以下核心模块:
- 文档处理模块:负责多格式文档的解析和文本提取
- 向量数据库模块:负责文档的向量化存储和相似度检索
- 测试技能库(Skill):存储领域特定的测试方法论和最佳实践
- 测试用例生成模块:结合业务需求和测试技能,生成高质量测试用例
- UI 交互模块:提供友好的 Web 界面供用户操作
2.2 核心技术栈
- 后端框架:FastAPI + Uvicorn
- 前端框架:Gradio
- 向量数据库:ChromaDB
- 文档处理:pdfplumber、python-docx、pandas、BeautifulSoup4
- 大语言模型:支持模型切换(百炼/自定义),内置百炼(DashScope)通义千问系列模型
- 编程语言:Python 3.8+
2.3 工作流程
工具启动,加载测试技能库(Skill)
↓
用户上传需求文档
↓
文档格式转换(提取纯文本)
↓
文档向量化(业务需求 + 测试技能)
↓
用户输入测试需求
↓
向量相似度检索(同时检索业务需求和相关测试技能)
↓
智能融合(业务需求优先,测试技能补充)
↓
大语言模型生成高质量测试用例
↓
结果展示(Markdown/表格视图)
关键环节说明:
- 技能库预加载:工具启动时自动加载所有测试技能文件到向量数据库
- 双重检索:生成测试用例时,同时检索业务需求文档和相关的测试技能
- 智能融合:优先使用业务需求作为测试依据,使用测试技能补充边界、异常、安全、兼容性等场景
- 质量保障:通过测试技能库确保生成的测试用例遵循最佳测试实践
三、过程解析
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 技能库与业务需求的协同工作
测试技能库与业务需求文档协同工作的方式:
-
加载技能库:工具启动时自动加载所有技能文件到向量数据库,标记 `type: "skill"
-
加载业务需求:用户上传的业务需求文档标记 `type: "business"
-
联合检索:生成测试用例时,同时检索业务需求和相关测试技能
-
智能融合:
- 优先使用业务需求作为测试依据
- 使用测试技能补充边界、异常、安全、兼容性等场景
- 严禁将测试技能中未在业务需求提及的功能当作需求生成用例
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 功能特性
-
测试技能库(Skill):
- 分层设计:通用技能、领域特定技能、平台相关技能
- 内置优惠券、登录、营销活动等多个领域的测试技能
- 支持技能库的持续更新和扩展
- 智能融合业务需求和测试技能,生成高质量测试用例
-
大模型集成平台:
- 支持模型提供商切换(百炼/自定义)
- 内置百炼(DashScope)通义千问系列模型(qwen-max、qwen-plus、qwen-turbo)
- 支持自定义模型配置(模型名称、API地址)
- UI动态显示/隐藏:选择不同提供商时显示对应配置选项
-
多格式文档支持:支持
.txt、.pdf、.docx、.doc、.html、.md、.xmind、.rp、.ppt、.pptx、.xlsx、.xls等多种格式 -
智能文档解析:自动提取文档中的关键信息,支持多层级文本提取和噪声过滤
-
向量数据库:使用 ChromaDB 构建向量数据库,实现高效的相似度搜索
-
测试用例生成:基于 RAG 技术,结合文档内容和用户需求,生成结构化的测试用例
-
多视图展示:支持 Markdown 视图和表格视图,方便查看和管理测试用例
-
Excel 导出:支持将生成的测试用例导出为 Excel 格式
-
文件夹上传:支持上传整个文件夹,保持原有文件夹结构
4.2 用户体验
- 直观的 Web 界面,操作简单直观
- 实时状态反馈,上传、转换、加载等操作都有明确的提示
- 响应式设计,适配不同屏幕尺寸
- 支持自定义测试用例数量范围
- 表格视图和 Markdown 视图自由切换
4.3 测试用例示例
以下是基于业务需求和测试技能库生成的测试用例示例:
4.3.1 登录功能测试用例示例
测试场景:用户手机号验证码登录
-
正向流程测试
- 输入正确的手机号和验证码,点击登录
- 验证登录成功,跳转到首页
-
边界条件测试
- 手机号为空时点击登录
- 验证码为空时点击登录
- 手机号格式不正确(10位、12位等)
- 验证码长度不足或超过6位
-
异常场景测试
- 手机号未注册时点击登录
- 验证码错误时点击登录
- 验证码过期时点击登录
- 验证码已使用时点击登录
-
安全测试
- 频繁发送验证码,验证是否有发送频率限制
- 输入特殊字符的手机号
- 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 | 异常场景 | 优惠券已被抢光 | 优惠券库存为0 | 1. 进入优惠券活动页面 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 功能增强
-
支持更多文档格式:
- 添加对思维导图格式(XMind、MindManager)的更好支持
- 添加对 Markdown 数学公式和流程图的支持
-
测试技能库优化:
- 支持技能库的在线编辑和管理
- 添加技能库的版本管理和回滚功能
- 支持技能库的分类和标签管理
- 添加技能库的搜索和推荐功能
- 支持从生成的测试用例中自动学习和提取新的测试技能
-
测试用例质量优化:
- 引入测试用例评审机制,支持用户反馈和修正
- 添加测试用例覆盖率分析功能
- 支持测试用例的版本管理和回溯
-
团队协作功能:
- 支持多用户协作
- 添加测试用例库的分享和复用功能
- 支持测试用例的评论和讨论
6.2 技术优化
-
向量数据库优化:
- 引入向量索引缓存机制
- 支持增量更新向量索引
- 优化相似度检索算法,提高检索准确性
-
大语言模型集成:
- 支持更多大语言模型(OpenAI、Claude、本地模型等)
- 添加模型对比和 A/B 测试功能
- 优化提示词,提高生成质量和稳定性
-
前端交互优化:
- 将Gradio替换为更专业的前端框架(如React、Vue、Next.js等)
- 提供更好的用户交互体验和视觉效果
- 支持更复杂的界面布局和组件
- 实现更流畅的动画和过渡效果
-
工具性能优化:
- 引入异步处理,提高并发能力
- 添加任务队列,支持后台处理
- 优化内存使用,支持处理更大的文档
作者:洞窝-延君