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=[...]
    )

    六、常见问题解决

    1. 生成格式不统一 → 在提示词中明确要求表格模板

    2. 缺少车载术语 → 在提示词中添加术语白名单

    3. 长文档丢失上下文 → 使用分块处理+最后添加汇总步骤

    4. 安全合规问题 → 在提示词中强调ISO 26262标准

    作者:Demons_皮

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python实战:利用Deepseek模型实现需求文档解析与测试用例自动生成

    发表回复