一、背景与系统定位
之前分享过两篇8分钟系列DeepSeek赋能软件测试的文章,吸引了很多志同道合的同学们的讨论,基于前面的文章,我们已构建了基础测试用例生成能力。今天主要聊一下知识库。
8分钟打造一个DeepSeek加持的测试用例工具
北极星学派,公众号:北极星学派 Polaris School8分钟打造一个DeepSeek加持的测试用例工具
8分钟打造一个DeepSeek API智能测试引擎:当咖啡还没凉,测试报告已出炉
北极星学派,公众号:北极星学派 Polaris School8分钟打造一个DeepSeek API智能测试引擎:当咖啡还没凉,测试报告已出炉
本系统在此基础上引入知识库增强生成(RAG)技术,通过融合领域文档与历史用例数据,使生成结果更贴合业务场景。
1.1 为什么需要知识库?
传统AI生成方案存在两大痛点:
- 领域知识缺失
大模型无法记忆企业私有文档(如需求规格书、接口文档) - 历史经验浪费
过往测试用例未被有效复用
本系统通过轻量化RAG架构(无需向量数据库)实现:
PDF文档智能解析 ➡️ 构建领域知识库 历史用例语义检索 ➡️ 形成经验复用机制 动态增强生成提示词 ➡️ 提升用例专业度
上传文档到知识库 第一次生成没选择使用知识库增强->设计的测试用例和手机号登录毫无关系 第二次选择使用知识库增强->设计的测试用例知道用手机号进行注册系统,并知道更多其他细节
二、核心逻辑解析
2.1 系统架构全景
2.2 关键技术点说明
2.2.1 知识库构建模块def process_pdf(uploaded_file):
# PDF分页提取文本
pdf_reader = PyPDF2.PdfReader(filepath)
# 智能分段规则,略简单粗暴
paragraphs = re.split(r'\n\s*\n', text)
# 结构化存储
segments.append({
'segment_id': f"{filename}_{page_num}_{i}",
'document_name': uploaded_file.name,
'page_num': page_num + 1,
'content': paragraph
})
def process_pdf(uploaded_file):
# PDF分页提取文本
pdf_reader = PyPDF2.PdfReader(filepath)
# 智能分段规则,略简单粗暴
paragraphs = re.split(r'\n\s*\n', text)
# 结构化存储
segments.append({
'segment_id': f"{filename}_{page_num}_{i}",
'document_name': uploaded_file.name,
'page_num': page_num + 1,
'content': paragraph
})创新点:
采用唯一段落ID 按自然段落分割,保留上下文语义 过滤无效短文本(<20字符)
2.2.2 增强检索引擎def find_similar_cases(new_req, df, top_k=3):
# TF-IDF向量化
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(...)
# 余弦相似度计算
similarity = cosine_similarity(tfidf_matrix[-1], tfidf_matrix[:-1])
return top_indices
def find_similar_cases(new_req, df, top_k=3):
# TF-IDF向量化
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(...)
# 余弦相似度计算
similarity = cosine_similarity(tfidf_matrix[-1], tfidf_matrix[:-1])
return top_indices设计考量:
相比BM25算法更易实现 计算效率:O(n)复杂度,千级数据实时响应 结果可解释性强,适合调试
2.2.3 动态提示词工程system_prompt = f"""参考知识:
文档《{item['document']}》第{item['page']}页:{item['content']}
历史用例{idx+1}: {case}
生成要求:
1. JSON数组格式...
"""
system_prompt = f"""参考知识:
文档《{item['document']}》第{item['page']}页:{item['content']}
历史用例{idx+1}: {case}
生成要求:
1. JSON数组格式...
"""增强策略:
知识片段截断处理(单段≤512字符) 优先级排序:领域知识 > 历史用例 格式强约束(JSON Schema注入)
三、关键技术选型解析
3.1 什么是RAG?
检索增强生成(Retrieval-Augmented Generation)通过以下流程提升生成质量:
用户问题 → 知识检索 → 提示词增强 → 大模型生成 → 结果输出
与传统生成的区别:
- 知识实时性
无需重新训练模型 - 数据安全性
敏感信息不离域 - 结果可控性
通过检索结果引导生成方向
3.2 为什么不用向量数据库?
尽管向量数据库(如ChromaDB)在RAG中广泛应用,但本系统选择TF-IDF+CSV文件存储方案,原因包括:
适合场景:
中小团队快速验证RAG价值 领域文档更新频率较低(周级) 测试数据规模<10万条
四、快速部署指南
4.1 环境准备
4.1.1 安装Python包# 核心依赖
pip install streamlit pandas requests sklearn
# PDF处理
pip install PyPDF2 pdfminer.six
# JSON修复
pip install json_repair
# 核心依赖
pip install streamlit pandas requests sklearn
# PDF处理
pip install PyPDF2 pdfminer.six
# JSON修复
pip install json_repair4.1.2 获取API密钥
访问任何一个大模型提供商处注册账号,本文采用腾讯云 创建应用 → 获取 sk-xxxx格式密钥在代码中替换: headers = {"Authorization": "Bearer sk-xxxx"}
4.2 系统启动# 首次运行自动创建知识库目录
mkdir -p temp
# 启动Web服务
streamlit run testcase_generator.py
# 首次运行自动创建知识库目录
mkdir -p temp
# 启动Web服务
streamlit run testcase_generator.py4.3 功能验证流程
上传领域文档:
进入"知识库管理"页 上传PDF格式需求文档/接口文档 查看处理后的知识段落 生成增强用例:
需求示例:
用户管理模块,包括用户注册和登陆等
勾选"使用知识库增强" 查看生成的边界值测试用例
结果导出:
pythonpd.DataFrame(new_cases).to_excel("output.xlsx")
直接复制JSON用例 通过Pandas导出Excel:
五、性能优化建议(有精力有能力的动手爱好者们可以继续优化)
5.1 知识库分级存储# knowledge_segments.csv新增字段
knowledge_df['category'] = "需求文档" # 需求文档|接口规范|测试报告
knowledge_df['importance'] = 5 # 1-5分级
# knowledge_segments.csv新增字段
knowledge_df['category'] = "需求文档" # 需求文档|接口规范|测试报告
knowledge_df['importance'] = 5 # 1-5分级检索时优先高等级知识片段
5.2 缓存机制from functools import lru_cache
@lru_cache(maxsize=100)
def load_cases():
# 缓存历史用例加载
from functools import lru_cache
@lru_cache(maxsize=100)
def load_cases():
# 缓存历史用例加载5.3 异步处理import asyncio
async def async_generate_cases():
# 非阻塞生成
import asyncio
async def async_generate_cases():
# 非阻塞生成六、扩展方向
- 多模态支持:解析图片中的需求文档(OCR技术)
- 自动化评审:添加用例质量评分模型
- CI/CD集成:与Jenkins/GitLab对接自动触发
