大模型應用之基于Langchain的測試用例生成

一 用例生成實踐效果

組內的日常工作安排中,持續優化測試技術、提高測試效率始終是重點任務。近期,我們在探索實踐使用大模型生成測試用例,期望能夠借助其強大的自然語言處理能力,自動化地生成更全面和高質量的測試用例。

當前,公司已經普及使用JoyCoder,我們可以拷貝相關需求及設計文檔的信息給到JoyCoder,讓其生成測試用例,但在使用過程中有以下痛點:

1)仍需要多步人工操作:如復制粘貼文檔,編寫提示詞,拷貝結果,保存用例等

2)響應時間久,結果不穩定:當需求或設計文檔內容較大時,提示詞太長或超出token限制

因此,我探索了基于Langchain與公司的提供的網關接口使測試用例可以自動、快速、穩定生成的方法,效果如下:

用例生成效果對比使用JoyCoder(GPT4)基于Langchain自研(GPT4)
生成時長 (針對項目--文檔內容較多)·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,將文件存入。 在創建數據表時,需要了解向量數據庫的檢索模型及其對應的參數,目前支持六種類型,IVFPQ,HNSW,GPU,IVFFLAT,BINARYIVF,FLAT(詳細區別和參數可點此鏈接),目前我選擇了較為基礎的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(content="You are a chatbot having a conversation with a human."),  # The persistent system promptMessagesPlaceholder(variable_name="chat_history"),  # Where the memory will be stored.HumanMessagePromptTemplate.from_template("{human_input}"),  # Where the human input will injected])memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)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_casechain = LLMChain(llm=llm,prompt=prompt,verbose=True,memory=memory,)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_fileembedding_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_url=router_url,db_name="y_test_qa",table_name=table_name,flag=1,)# 從向量數據庫搜索相關內容docs = vearch_cluster.similarity_search(query=input_prompt, k=1)content = docs[0].page_content# 使用向量查詢的相關信息給大模型生成用例prompt_template = "作為軟件測試開發專家,請根據產品需求技術設計中{input_prompt}的相關信息:{content},以markdown格式輸出測試用例,用例模版是:{empty_case}"prompt = PromptTemplate(input_variables=["input_prompt", "content", "empty_case"],template=prompt_template)llm = LLMFactory.get_openai_factory().get_chat_llm()chain = LLMChain(llm=llm,prompt=prompt,verbose=True)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.5(45例=25例自動生成+20例人工修正/補充)
評審及用例差缺補漏0.50.25
總計(效率提升50%2.5人日1.25人日

本次利用大模型自動生成用例的優缺點:

優勢:

?全面快速的進行了用例的邏輯點劃分,協助測試分析理解需求及設計

?降低編寫測試用例的時間,人工只需要進行內容確認和細節調整

?用例內容更加全面豐富,在用例評審時,待補充的點變少了,且可以有效防止漏測

?如測試人員僅負責一部分功能的測試,也可通過向量數據庫搜索的形式,聚焦部分功能的生成

劣勢:

?暫時沒實現對流程圖的理解,當文本描述較少時,生成內容有偏差

?對于有豐富經驗的測試人員,自動生成用例的思路可能與自己習慣的思路不一致,需要自己再調整或適應



四 待解決問題及后續計劃

1.對于pdf中的流程圖(圖片形式),實現了文字提取識別(langchain pdf相關的方法支持了ocr識別),后續需要找到更適合解決圖內容的解析、檢索的方式。

2.生成用例只是測試提效的一小部分,后續需要嘗試將大模型應用與日常測試過程,目前的想法有針對diff代碼和服務器日志的分析來自動定位缺陷、基于模型驅動測試結合知識圖譜實現的自動化測試等方向。



本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/16795.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/16795.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/16795.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【cocos creator】進度條控制腳本,支持節點進度條,圖片進度條,進度條組件,和進度文字展示

進度條控制腳本,支持節點進度條,圖片進度條,進度條組件,和進度文字展示 const { ccclass, property, menu } cc._decorator;let text_type cc.Enum({"20%": 0,"1/5": 1,"差值": 2,"自定義…

Django結合Manager重寫create、update、delete方法

想要重寫create、update、delete方法我們先要了解一下其他的知識點 Manager 在Django中,Manager是一個非常核心的概念,它負責與數據庫交互,提供了訪問和管理模型實例(即數據庫中的記錄)的方式。每個Django模型類默認…

jupyter lab怎么使用cmd打開

我一般都是用vscode,或者pycharm的終端打開 但是我為了秉承程序員的素養(就是覺得命令行打開很帥) 我試著去直接用一樣的命令,但是不行,顯示不是內部命令之類的。 是因為沒有配置環境變量。 但是我突然發現&#x…

【計算機畢業設計】基于SSM++jsp的汽車客運站管理系統【源碼+lw+部署文檔】

目錄 第1章 緒論 1.1 課題背景 1.2 課題意義 1.3 研究內容 第2章 開發環境與技術 2.1 MYSQL數據庫 2.2 JSP技術 2.3 SSM框架 第3章 系統分析 3.1 可行性分析 3.1.1 技術可行性 3.1.2 經濟可行性 3.1.3 操作可行性 3.2 系統流程 3.2.1 操作流程 3.2.2 登錄流程 3.2.3 刪除信息流…

rpm與yum擴展、命令

目錄 系統安裝軟件方式 1、rpm方式 命令 yum方式 安裝 更新和升級 查找與顯示 刪除程序 清除緩存 僅下載 系統安裝軟件方式 1、rpm方式 優點:無需網絡安裝軟件 缺點:無法解決軟件依賴 命令 rpm -ivh 安裝 --nodeps忽略依賴關系 --force強…

希爾伯特 包絡證明 未出現模態混合現象 是啥?

希爾伯特變換在信號處理中常用于求信號的包絡,它是一種線性運算,能夠將實數信號轉換為其解析信號,即包含原信號及其希爾伯特變換的復數信號。解析信號的實部是原信號,虛部是原信號的希爾伯特變換。 包絡證明 在信號處理中&#…

TypeScript 學習筆記(五):異步編程與錯誤處理

1. 引言 在前幾篇學習筆記中,我們介紹了 TypeScript 的基礎知識、高級類型系統、模塊與命名空間以及裝飾器和高級編程技巧。本篇將重點探討 TypeScript 中的異步編程與錯誤處理,幫助你在實際項目中更好地處理異步操作和錯誤。 2. 異步編程 異步編程是現代 JavaScript 應用…

C語言預處理中#和##運算符是什么意思?

一、問題 有?認為,在C 語?中使?“#”運算符的就是預處理,是不是呢?“##”?是什么呢? 二、解答 在程序中,最為常?的是#define 宏定義指令,下?通過這個指令理解?下“#”的作?。編寫?個預處理指令&a…

人大金倉 KingBase查詢死鎖,釋放死鎖

人大金倉(kingbase)查詢數據庫死鎖及釋放 kingbase鎖表排查以及釋放鎖 總結下 -- 查詢,可自己添加where條件 SELECT * FROM sys_stat_activity WHERE state ! idle AND wait_event_typeLock-- 結束進程 SELECT sys_terminate_backend(pid);

PLC集成BL121PO網關優化智能電網的遠程管理PLC轉OPC UA協議

隨著工業自動化技術的不斷發展,智能電網等復雜系統對于設備之間高效通信的需求日益增加。PLC轉OPC UA協議轉換網關BL121PO作為一款領先的協議轉換設備,通過其獨特的設計和功能,為用戶提供了高效、安全的PLC接入OPC UA的解決方案。 設備概述 …

了解Hive 工作原理:Hive 是如何工作的?

一、概念 1、Hive Apache Hive 是一個分布式的容錯數據倉庫系統,可實現大規模分析和便于使用 SQL 讀取、寫入和管理駐留在分布式存儲中的PB級數據。 Hive是建立在Hadoop之上的數據倉庫框架,它提供了一種類SQL的查詢語言—HiveQL,使得熟悉S…

【深度學習實戰—8】:基于MediaPipe的人臉檢測

?博客主頁:王樂予🎈 ?年輕人要:Living for the moment(活在當下)!💪 🏆推薦專欄:【圖像處理】【千錘百煉Python】【深度學習】【排序算法】 目錄 😺一、Med…

軟件3班20240527

JDK 版本與 Tomcat 的 兼容性

rk3568_spinlock

文章目錄 前言1、spinlock是什么?2、自旋鎖實驗2.1源碼2.2 結果圖總結前言 本文記錄在rk3568開發板做的自旋鎖實驗。通過自旋鎖控制state變量來限制只有一個應用程序來打開驅動設備。 1、spinlock是什么? spinlock稱為自旋鎖,如果獲取不到資源,就只能一直傻傻地等待資源被…

實現銷售與客流雙增長!看看社區零售“排隊王”如何成為頂流?

5月18日至5月26日,北京華聯BHGMall燃情推出了一年一度的2024 Need(你的)BHGDay,接棒“五一”熱潮,獻禮“520”,通過韓式俯拍機、人生四宮格拍攝大賽、真合拍星派對、超級品牌日等豐富多彩的線上線下活動&am…

Python心得(待補充)

Python編程習慣 打開jupyter notebook,用于測試一些小的代碼塊或者函數 Python學習的一些好網站 對于內容少的可以看一遍 對于內容多的,可以當工具書檢索使用 下列網站的知識涵蓋度由淺到深,可以按照(暫定)順序逐個進行檢索,即先…

dynamic與指針

C類型父類與子類的轉換--dynamic_cast - ren_zhg1992 - 博客園 (cnblogs.com) #include <iostream> using namespace std;class Base { public:Base() {};virtual void Show() { cout << "This is Base calss"; } }; class Derived :public Base { publ…

迷你手持小風扇哪個牌子質量好又實惠?這五款不踩雷推薦!

每年夏天&#xff0c;迷你手持小風扇作為消暑神器都會成為市場上的熱銷產品。然而&#xff0c;由于選購經驗有限&#xff0c;許多消費者在面對眾多品牌和型號時&#xff0c;往往難以判斷哪個牌子的迷你小風扇既質量好又價格實惠。在追求性價比的同時&#xff0c;我們也不應忽視…

【設計模式】JAVA Design Patterns——Data Access Object(數據訪問對象模式)

&#x1f50d;目的 對象為某種類型的數據庫或其他持久性機制提供了抽象接口。 &#x1f50d;解釋 真實世界例子 有一組客戶數據需要持久化到數據庫中。 我們需要整個額外的增刪改查操作以便操作客戶數據。 通俗描述 DAO是我們通過基本持久性機制提供的接口。 維基百科 在計算機…

【云原生】kubernetes中的認證、權限設置---RBAC授權原理分析與應用實戰

?? 歡迎大家來到景天科技苑?? &#x1f388;&#x1f388; 養成好習慣&#xff0c;先贊后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者簡介&#xff1a;景天科技苑 &#x1f3c6;《頭銜》&#xff1a;大廠架構師&#xff0c;華為云開發者社區專家博主&#xff0c;…