大模型应用之基于Langchain的测试用例生成
一 用例生成实践效果在组内的日常工作安排中持续优化测试技术、提高测试效率始终是重点任务。近期我们在探索实践使用大模型生成测试用例期望能够借助其强大的自然语言处理能力自动化地生成更全面和高质量的测试用例。当前公司已经普及使用JoyCoder我们可以拷贝相关需求及设计文档的信息给到JoyCoder让其生成测试用例但在使用过程中有以下痛点1仍需要多步人工操作如复制粘贴文档编写提示词拷贝结果保存用例等2响应时间久结果不稳定当需求或设计文档内容较大时提示词太长或超出token限制因此我探索了基于Langchain与公司现有平台使测试用例可以自动、快速、稳定生成的方法效果如下用例生成效果对比使用JoyCoder基于Langchain自研生成时长 针对项目--文档内容较多·10~20分钟左右需要多次人工操作 先会有一个提示根据您提供的需求文档下面是一个Markdown格式的测试用例示例。由于文档内容比较多我将提供一个概括性的测试用例模板您可以根据实际需求进一步细化每个步骤。 ·内容太多时报错The maximum default token limit has been reached、UNKNOWN ERROR:Request timed out. This may be due to the server being overloaded需要人工尝试输入多少内容合适·5分钟左右自动生成 通过摘要生成全部测试点后再通过向量搜索的方式生成需要细化的用例 ·内容太多时可根据token文本切割后再提供给大模型生成时长 针对普通小需求差别不大1~5分钟准确度依赖提示词内容差别不大但自研时更方便给优化好的提示词固化下来什么是LangChain 它是一个开源框架用于构建基于大型语言模型 LLM的应用程序。LLM 是基于大量数据预先训练的大型深度学习模型可以生成对用户查询的响应例如回答问题或根据基于文本的提示创建图像。LangChain 提供各种工具和抽象以提高模型生成的信息的定制性、准确性和相关性。例如开发人员可以使用 LangChain 组件来构建新的提示链或自定义现有模板。LangChain 还包括一些组件可让 LLM 无需重新训练即可访问新的数据集。二 细节介绍1 基于Langchain的测试用例生成方案方案优点缺点适用场景方案1将全部产品需求和研发设计文档给到大模型自动生成用例用例内容相对准确不支持特大文档容易超出token限制普通规模的需求及设计方案2将全部产品需求和研发设计文档进行摘要后将摘要信息给到大模型自动生成用例进行摘要后无需担心token问题用例内容不准确大部分都只能是概况性的点特大规模的需求及设计方案3将全部产品需求和研发设计文档存入向量数据库通过搜索相似内容自动生成某一部分的测试用例用例内容更聚焦 无需担心token问题不是全面的用例仅对需求及设计中的某一部分进行用例生成因3种方案使用场景不同优缺点也可互补故当前我将3种方式都实现了提供大家按需调用。2 实现细节2.1 整体流程2.2 技术细节说明•pdf内容解析Langchain支持多种文件格式的解析如csv、json、html、pdf等而pdf又有很多不同的库可以使用本次我选择PyMuPDF它以功能全面且处理速度快为优势•文件切割处理为了防止一次传入内容过多容易导致大模型响应时间久或超出token限制利用Langchain的文本切割器将文件分为各个小文本的列表形式•Memory的使用大多数 LLM 模型都有一个会话接口当我们使用接口调用大模型能力时每一次的调用都是新的一次会话。如果我们想和大模型进行多轮的对话而不必每次重复之前的上下文时就需要一个Memory来记忆我们之前的对话内容。Memory就是这样的一个模块来帮助开发者可以快速的构建自己的应用“记忆”。本次我使用Langchain的ConversationBufferMemory与ConversationSummaryBufferMemory来实现将需求文档和设计文档内容直接存入Memory可减少与大模型问答的次数减少大模型网关调用次数提高整体用例文件生成的速度。ConversationSummaryBufferMemory主要是用在提取“摘要”信息的部分它可以将将需求文档和设计文档内容进行归纳性总结后再传给大模型•向量数据库利用公司已有的向量数据库 [测试环境Vearch]将文件存入。 在创建数据表时需要了解向量数据库的检索模型及其对应的参数目前支持六种类型IVFPQHNSWGPUIVFFLATBINARYIVFFLAT详细区别和参数可点此链接目前我选择了较为基础的IVFFLAT--基于量化的索引后续如果数据量太大或者需要处理图数据时再优化。另外Langchain也有很方便的vearch存储和查询的方法可以使用2.3 代码框架及部分代码展示代码框架代码示例def case_gen(prd_file_path, tdd_file_path, input_prompt, case_name): 用例生成的方法 参数: prd_file_path - prd文档路径 tdd_file_path - 技术设计文档路径 case_name - 待生成的测试用例名称 # 解析需求、设计相关文档, 输出的是document列表 prd_file PDFParse(prd_file_path).load_pymupdf_split() tdd_file PDFParse(tdd_file_path).load_pymupdf_split() empty_case FilePath.read_file(FilePath.empty_case) # 将需求、设计相关文档设置给memory作为llm的记忆信息 prompt ChatPromptTemplate.from_messages( [ SystemMessage( contentYou are a chatbot having a conversation with a human. ), # The persistent system prompt MessagesPlaceholder( variable_namechat_history ), # Where the memory will be stored. HumanMessagePromptTemplate.from_template( {human_input} ), # Where the human input will injected ] ) memory ConversationBufferMemory(memory_keychat_history, return_messagesTrue) for prd in prd_file: memory.save_context({input: prd.page_content}, {output: 这是一段需求文档后续输出测试用例需要}) for tdd in tdd_file: memory.save_context({input: tdd.page_content}, {output: 这是一段技术设计文档后续输出测试用例需要}) # 调大模型生成测试用例 llm LLMFactory.get_openai_factory().get_chat_llm() human_input 作为软件测试开发专家请根据以上的产品需求及技术设计信息 input_prompt ,以markdown格式输出测试用例用例模版是 empty_case chain LLMChain( llmllm, promptprompt, verboseTrue, memorymemory, ) output_raw chain.invoke({human_input: human_input}) # 保存输出的用例内容markdown格式 file_path FilePath.out_file case_name .md with open(file_path, w) as file: file.write(output_raw.get(text))def case_gen_by_vector(prd_file_path, tdd_file_path, input_prompt, table_name, case_name): !!!当文本超级大时防止token不够通过向量数据库搜出某一部分的内容生成局部的测试用例细节更准确一些!!! 参数: prd_file_path - prd文档路径 tdd_file_path - 技术设计文档路径 table_name - 向量数据库的表名分业务存储一般使用业务英文唯一标识的简称 case_name - 待生成的测试用例名称 # 解析需求、设计相关文档, 输出的是document列表 prd_file PDFParse(prd_file_path).load_pymupdf_split() tdd_file PDFParse(tdd_file_path).load_pymupdf_split() empty_case FilePath.read_file(FilePath.empty_case) # 把文档存入向量数据库 docs prd_file tdd_file embedding_model LLMFactory.get_openai_factory().get_embedding() router_url ConfigParse(FilePath.config_file_path).get_vearch_router_server() vearch_cluster Vearch.from_documents( docs, embedding_model, path_or_urlrouter_url, db_namey_test_qa, table_nametable_name, flag1, ) # 从向量数据库搜索相关内容 docs vearch_cluster.similarity_search(queryinput_prompt, k1) content docs[0].page_content # 使用向量查询的相关信息给大模型生成用例 prompt_template 作为软件测试开发专家请根据产品需求技术设计中{input_prompt}的相关信息:{content},以markdown格式输出测试用例用例模版是:{empty_case} prompt PromptTemplate( input_variables[input_prompt, content, empty_case], templateprompt_template ) llm LLMFactory.get_openai_factory().get_chat_llm() chain LLMChain( llmllm, promptprompt, verboseTrue ) output_raw chain.invoke( {input_prompt: input_prompt, content: content, empty_case: empty_case}) # 保存输出的用例内容markdown格式 file_path FilePath.out_file case_name .md with open(file_path, w) as file: file.write(output_raw.get(text))三 效果展示3.1 实际运用到需求/项目的效果用例生成后是否真的能帮助我们节省用例设计的时间是大家重点关注的因此我随机在一个小型需求中进行了实验此需求的PRD文档总字数2363设计文档总字数158因大部分是流程图结果如下用例设计环节测试时间人日占用效果分析可自动生成用例之前可自动生成用例之后分析需求理解技术设计0.50.25与产研确认细节0.250.25设计及编写用例1(39例)0.545例25例自动生成20例人工修正/补充评审及用例差缺补漏0.50.25总计效率提升****50%2.5人日1.25人日本次利用大模型自动生成用例的优缺点优势• 全面快速的进行了用例的逻辑点划分协助测试分析理解需求及设计• 降低编写测试用例的时间人工只需要进行内容确认和细节调整• 用例内容更加全面丰富在用例评审时待补充的点变少了且可以有效防止漏测• 如测试人员仅负责一部分功能的测试也可通过向量数据库搜索的形式聚焦部分功能的生成劣势• 暂时没实现对流程图的理解当文本描述较少时生成内容有偏差• 对于有丰富经验的测试人员自动生成用例的思路可能与自己习惯的思路不一致需要自己再调整或适应四 待解决问题及后续计划1.对于pdf中的流程图图片形式实现了文字提取识别langchain pdf相关的方法支持了ocr识别后续需要找到更适合解决图内容的解析、检索的方式。2.生成用例只是测试提效的一小部分后续需要尝试将大模型应用与日常测试过程目前的想法有针对diff代码和服务器日志的分析来自动定位缺陷、基于模型驱动测试结合知识图谱实现的自动化测试等方向。最后下方这份完整的软件测试 视频教程已经整理上传完成需要的朋友们可以自行领取【保证100%免费】软件测试面试文档我们学习必然是为了找到高薪的工作下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料并且有字节大佬给出了权威的解答刷完这一套面试资料相信大家都能找到满意的工作。