Python实战:利用Deepseek模型实现需求文档解析与测试用例自动生成
一、整体架构
流程图: 需求文档 → Python解析 → 调用DeepSeek API → 结构化测试用例 → 输出Excel/TestLink
二、环境准备
1. 注册DeepSeek API
访问 DeepSeek官网 注册账号
获取API Key(使用 DeepSeek API 之前,请先 创建 API 密钥)
DeepSeek(可在淘宝购买API)
2. 安装Python库
pip install openai python-docx pandas PyPDF2 jinja2
三、代码实现
步骤1:文档解析(PDF/Word/Excel)
"""--------------------------
文件:doc_parser.py
功能:解析需求文档为纯文本
--------------------------"""
from PyPDF2 import PdfReader
from docx import Document
import pandas as pd
from comtypes import client
import os
def convert_doc_to_docx(file_path):
'''
将.doc转换为.docx
:param file_path:old_file_path
:return:new_file_path
'''
word = client.CreateObject("Word.Application")
doc = word.Documents.Open(file_path)
output_path = os.path.splitext(file_path)[0] + ".docx"
doc.SaveAs(output_path, FileFormat=16) # 16表示docx格式
doc.Close()
word.Quit()
return output_path
def parse_document(file_path):
if file_path.endswith('.pdf'):
reader = PdfReader(file_path)
text = "".join([page.extract_text() for page in reader.pages])
elif file_path.endswith('.docx'):
doc = Document(file_path)
text = "\n".join([para.text for para in doc.paragraphs])
elif file_path.endswith('.xlsx'):
df = pd.read_excel(file_path)
text = df.to_string()
elif file_path.endswith('.doc'):
docx_path = convert_doc_to_docx(file_path)
doc = Document(docx_path)
text = "\n".join([para.text for para in doc.paragraphs])
else:
raise ValueError("Unsupported file format")
return text
if __name__ == '__main__':
doc_text = parse_document(r"D:\7_NLP\1_需求文档\车载需求文档.doc")
print("解析后的文本:\n", doc_text[:500]) # 打印前500字符
运行结果
D:\1_Python3.8\python.exe D:\2_PythonProject\deepseek\document_analysis\Document_Analysis.py
解析后的文本:
车载智能座舱系统需求规格说明书
版本:V1.0
发布日期:2023-XX-XX
1. 文档修订记录
2. 项目概述
2.1 项目背景
为满足智能汽车发展趋势,开发新一代车载座舱系统,集成语音交互、多屏联动、ADAS等功能,符合ISO 26262功能安全标准(ASIL-B)。
2.2 系统范围
markdown
复制
- 硬件:中控屏/仪表盘/HUD/座舱域控制器- 软件:Android Automotive OS + QNX- 网络:CAN/LIN/Ethernet
3. 功能需求
3.1 语音交互系统(VOICE-001)
3.2 多屏互动(DISPLAY-002)
markdown
复制
1. **主屏与仪表盘同步**
- 要求:导航路线实时同步,延迟 ≤ 100ms
- 触发条件:用户在中控屏启动导航
- 异常处理:网络断开时缓存最后有效路径
2. **HUD投影**
- 显示内容:车速/限速/ADAS报警(碰撞预警、车道偏离)
- 亮度调节:根据环境光自动调整(范围:200-1000cd/m²)
4. 非功能需求
4.1
进程已结束,退出代码为 0
步骤2:调用DeepSeek API生成测试用例(key需要替换自己的)
"""--------------------------
文件:deepseek_api.py
功能:调用API生成测试用例
--------------------------"""
from openai import OpenAI
from deepseek.document_analysis.Document_Analysis import parse_document
# 配置API密钥
public_api = "https://api.deepseek.com/v1"
taobao_api = 'https://tbnx.plus7.plus/v1'
person_key = 'sk-9e5ab9c39eb04dd98e2a6f9***********'
taobao_key= 'sk-XDGydOolynvCuBBXtAKjHfIkA8kuC3Xs*************'
client = OpenAI(api_key=taobao_key, base_url=taobao_api)
def generate_test_case(doc_text):
prompt = f"""
角色:你是有10年经验的汽车电子测试工程师
任务:将需求转换为符合ISO 26262标准的测试用例
要求:
1. 安全等级按ASIL分级
2. 必须包含[预处理条件][测试步骤][预期结果]
3. 使用车载术语:ECU、CAN ID 0x0A3、DTC故障码、AEB等
4. 输出表格包含:用例ID、需求追踪ID、测试类型(功能/性能/安全)
需求文档内容:
{doc_text[:3000]} # 截取前3000字符避免超长
参考案例:
| ID | 需求ID | 测试类型 | 预置条件 | 测试步骤 | 预期结果 |
|----|--------|----------|----------|----------|----------|
| TC-ADAS-01 | REQ-2024 | 功能测试 | 1. 启动ADAS系统<br>2. 设置车速60km/h | 模拟前方障碍物 | 1秒内触发自动刹车 |
"""
response = client.chat.completions.create(
model="deepseek-chat",
messages=[{"role": "user", "content": prompt}],
temperature=0.3 # 降低随机性
)
return response.choices[0].message.content
if __name__ == '__main__':
doc_text = parse_document(r"D:\7_NLP\1_需求文档\车载需求文档.doc")
test_cases = generate_test_case(doc_text)
print("生成的测试用例:\n", test_cases)
运行结果
D:\1_Python3.8\python.exe D:\2_PythonProject\deepseek\generate_testcase\Generate_TestCase.py
生成的测试用例:
根据需求文档内容,以下是将需求转换为符合ISO 26262标准的测试用例的表格:
| ID | 需求ID | 测试类型 | 预置条件 | 测试步骤 | 预期结果 |
|----------|-----------|----------|--------------------------------------------------------------------------|--------------------------------------------------------------------------|--------------------------------------------------------------------------|
| TC-VOICE-01 | VOICE-001 | 功能测试 | 1. 启动车载智能座舱系统<br>2. 确保语音交互系统已激活 | 1. 使用语音命令启动导航<br>2. 使用语音命令调整音量 | 1. 导航系统正确启动<br>2. 音量调整至指定水平 |
| TC-DISPLAY-01 | DISPLAY-002 | 功能测试 | 1. 启动车载智能座舱系统<br>2. 确保中控屏和仪表盘已连接 | 1. 在中控屏启动导航<br>2. 观察仪表盘显示 | 1. 导航路线实时同步,延迟 ≤ 100ms<br>2. 仪表盘显示与中控屏一致 |
| TC-DISPLAY-02 | DISPLAY-002 | 功能测试 | 1. 启动车载智能座舱系统<br>2. 确保HUD已连接 | 1. 观察HUD显示内容<br>2. 调整环境光 | 1. HUD显示车速/限速/ADAS报警信息<br>2. HUD亮度自动调整至200-1000cd/m² |
| TC-RELIABILITY-01 | 4.2 | 性能测试 | 1. 启动车载智能座舱系统<br>2. 确保系统已运行24小时 | 1. 观察系统运行状态<br>2. 模拟关键服务崩溃 | 1. 系统持续运行无重启<br>2. 关键服务在5秒内自动重启 |
| TC-SAFETY-01 | 4.3 | 安全测试 | 1. 启动车载智能座舱系统<br>2. 确保ADAS系统已激活 | 1. 模拟前方障碍物<br>2. 观察AEB系统响应 | 1. AEB系统在1秒内触发自动刹车<br>2. 系统记录DTC故障码(如适用) |
| TC-EMC-01 | 7.1 | EMC测试 | 1. 启动车载智能座舱系统<br>2. 确保系统处于正常工作状态 | 1. 进行EMC测试,模拟电磁干扰<br>2. 观察系统运行状态 | 1. 系统符合CISPR 25 Class 3标准<br>2. 系统无异常响应或故障 |
| TC-NETWORK-01 | 6.1 | 功能测试 | 1. 启动车载智能座舱系统<br>2. 确保CAN网络已连接 | 1. 发送CAN ID 0x0A3信号<br>2. 观察ECU响应 | 1. ECU正确接收并处理CAN信号<br>2. 系统无异常响应或故障 |
| TC-PERFORMANCE-01 | 4.1 | 性能测试 | 1. 启动车载智能座舱系统<br>2. 模拟50%内存占用 | 1. 进行多任务操作<br>2. 观察系统响应时间 | 1. 系统响应时间符合SLA要求<br>2. 系统无卡顿或崩溃 |
这些测试用例涵盖了功能、性能、安全等多个方面,并符合ISO 26262标准(ASIL-B)。每个测试用例都包含了预处理条件、测试步骤和预期结果,确保测试的全面性和可追溯性。
进程已结束,退出代码为 0
步骤3:结果输出到Excel
import pandas as pd
from io import StringIO
def save_to_excel(markdown_table, output_path):
# 将Markdown表格转换为DataFrame
data = StringIO(markdown_table)
df = pd.read_csv(data, sep="|", skiprows=2, header=0)
df = df.dropna(axis=1, how='all') # 删除空列
df.columns = df.columns.str.strip()
# 保存Excel
df.to_excel(output_path, index=False)
print(f"已保存到 {output_path}")
运行结果
到这里,我们已经实现了雏形的搭建,后续优化和训练完成后,才能落地使用
四、关键优化点
1. 提示词设计技巧(针对车载场景)
# 最佳实践提示词模板
prompt_template = """
角色:你是有10年经验的汽车电子测试工程师
任务:将需求转换为符合ISO 26262标准的测试用例
要求:
1. 安全等级按ASIL分级
2. 必须包含[预处理条件][测试步骤][预期结果]
3. 使用车载术语:ECU、CAN ID 0x0A3、DTC故障码、AEB等
4. 输出表格包含:用例ID、需求追踪ID、测试类型(功能/性能/安全)
需求原文:
{input_text}
参考案例:
| ID | 需求ID | 测试类型 | 预置条件 | 测试步骤 | 预期结果 |
|----|--------|----------|----------|----------|----------|
| TC-ADAS-01 | REQ-2024 | 功能测试 | 1. 启动ADAS系统<br>2. 设置车速60km/h | 模拟前方障碍物 | 1秒内触发自动刹车 |
"""
# 在代码中动态替换内容
prompt = prompt_template.format(input_text=doc_text)
2. 处理长文档策略
def split_document(text, max_length=3000):
"""将长文档分块处理"""
return [text[i:i+max_length] for i in range(0, len(text), max_length)]
# 分批调用API
all_cases = []
for chunk in split_document(doc_text):
all_cases.append(generate_test_case(chunk))
3. 校验机制
def validate_case(test_case):
"""检查是否包含车载关键词"""
required_keywords = ['ECU', 'CAN', '信号', '故障码']
return any(kw in test_case for kw in required_keywords)
if not validate_case(test_cases):
print("警告:生成结果不符合车载标准!")
五、模型微调
1. 准备训练数据
// 文件:fine_tuning_data.jsonl
{
"messages": [
{"role": "user", "content": "需求:当检测到电池温度超过80°C时,系统应切断电源"},
{"role": "assistant", "content":
"| TC-BMS-01 | REQ-BAT-001 | 安全测试 | 电池温度传感器正常 | 1. 模拟温度升至85°C | 主继电器断开 | ASIL-D |"}
]
}
2. 执行微调
curl https://api.deepseek.com/v1/fine_tuning/jobs \
-H "Authorization: Bearer $DEEPSEEK_API_KEY" \
-F "training_file=@fine_tuning_data.jsonl" \
-F "model=deepseek-chat"
3. 使用微调后的模型
response = openai.ChatCompletion.create(
model="ft:deepseek-chat-xxxxxx", # 使用返回的微调模型ID
messages=[...]
)
六、常见问题解决
-
生成格式不统一 → 在提示词中明确要求表格模板
-
缺少车载术语 → 在提示词中添加术语白名单
-
长文档丢失上下文 → 使用分块处理+最后添加汇总步骤
-
安全合规问题 → 在提示词中强调ISO 26262标准
作者:Demons_皮