測試用例生成平臺通過大模型升級查詢功能,生成智能測試用例

在測試工作中,查詢功能是各類系統的核心模塊,傳統的測試用例編寫往往耗時且重復。如何讓老舊平臺煥發新活力?本文將結合大模型技術,通過用戶輸入的字段信息,自動化生成高效、精準的測試用例。同時,我們還將介紹如何在 Django 框架中異步調用阿里云的 DeepSeek-R1 API,避免阻塞主線程,從而進一步提升系統性能。點擊底部小卡片了解更多AI測試話題。


一、傳統查詢功能的痛點

在老舊平臺中,查詢功能面臨以下問題:

  1. 測試用例編寫耗時:每次需求變更后,測試用例需要手動更新,效率低下。
  2. 用例質量參差不齊:測試人員的理解差異導致用例覆蓋率和場景設計不足。
  3. 缺乏智能化:無法根據用戶輸入的字段信息自動生成測試用例,適應動態變化的需求。

二、大模型驅動的查詢功能升級

2.1 升級方案概述

通過將用戶輸入的字段名稱、字段類型、字段值等信息傳遞給大模型,我們可以自動生成符合標準的測試用例。以下是升級的基本邏輯:

  1. 用戶輸入查詢條件(字段名稱、類型、值等)。
    在這里插入圖片描述

  2. 系統將輸入的信息封裝為提示詞(Prompt),并發送給大模型。
    在這里插入圖片描述

  3. 大模型根據模板自動生成測試用例,包括查詢步驟和預期結果。 真拿來即用!
    在這里插入圖片描述

[{"title": "根據機構、類型、開始日期、結束日期組合查詢","steps": "1.進入頁面;\n2.在機構中選擇湖北分公司;\n3.在類型中選擇當年;\n4.在開始日期輸入2023-01-01;\n5.在結束日期輸入2023-12-31;\n6.點擊查詢","expect_results": "查詢到湖北分公司當年且在2023-01-01至2023-12-31期間的數據","priority": "P0"},{"title": "根據開始日期、結束日期組合查詢","steps": "1.進入頁面;\n2.在開始日期輸入2023-01-01;\n3.在結束日期輸入2023-12-31;\n4.其他條件保持默認;\n5.點擊查詢","expect_results": "查詢到2023-01-01至2023-12-31期間的數據","priority": "P0"},{"title": "根據機構、類型組合查詢","steps": "1.進入頁面;\n2.在機構中選擇湖北分公司;\n3.在類型中選擇當年;\n4.其他條件保持默認;\n5.點擊查詢","expect_results": "查詢到湖北分公司當年的數據","priority": "P1"},{"title": "根據機構、開始日期、結束日期組合查詢","steps": "1.進入頁面;\n2.在機構中選擇湖北分公司;\n3.在開始日期輸入2023-01-01;\n4.在結束日期輸入2023-12-31;\n5.其他條件保持默認;\n6.點擊查詢","expect_results": "查詢到湖北分公司且在2023-01-01至2023-12-31期間的數據","priority": "P1"},{"title": "根據類型、開始日期、結束日期組合查詢","steps": "1.進入頁面;\n2.在類型中選擇當年;\n3.在開始日期輸入2023-01-01;\n4.在結束日期輸入2023-12-31;\n5.其他條件保持默認;\n6.點擊查詢","expect_results": "查詢到當年且在2023-01-01至2023-12-31期間的數據","priority": "P1"},{"title": "根據機構查詢","steps": "1.進入頁面;\n2.在機構中選擇湖北分公司;\n3.其他條件保持默認;\n4.點擊查詢","expect_results": "查詢到湖北分公司的所有數據","priority": "P2"},{"title": "根據類型查詢","steps": "1.進入頁面;\n2.在類型中選擇當年;\n3.其他條件保持默認;\n4.點擊查詢","expect_results": "查詢到當年的所有數據","priority": "P2"},{"title": "根據開始日期查詢","steps": "1.進入頁面;\n2.在開始日期輸入2023-01-01;\n3.其他條件保持默認;\n4.點擊查詢","expect_results": "查詢到開始日期大于等于2023-01-01的數據","priority": "P3"},{"title": "根據結束日期查詢","steps": "1.進入頁面;\n2.在結束日期輸入2023-12-31;\n3.其他條件保持默認;\n4.點擊查詢","expect_results": "查詢到結束日期小于等于2023-12-31的數據","priority": "P3"}
]

2.2 提示詞邏輯設計

我們設計如下提示詞模板:

prompt = (f'系統名稱為: {project};主功能模塊名稱為: {primary_module};子功能模塊為:{sub_module};'f'用例創建人為: {case_creator};'f'查詢結果比對方式為: {check_result_method};'f'查詢頁面是否需要補充UI測試用例: {ui_case_needed};自主標定用例的優先級;')prompt += f'字段名稱: {field_name};字段類型: {field_type};'if enums:prompt += f'枚舉值:{enums};'
elif symbol_date:prompt += f'日期符號為:{symbol_date};'
elif date_:prompt += f'日期為:{date_};'
elif symbol_time:prompt += f'時間比較符號為:{symbol_time};'
elif time_:prompt += f'時間選定的值為:{time_};\n'

2.3 自動生成的測試用例示例

根據提示詞生成的測試用例示例如下:

[{'title': '根據姓名查詢'},{'steps': '1.進入頁面;\n2.在查詢條件姓名輸入;\n3.其他查詢條件保持默認;\n4.點擊查詢'},{'expect_results': '查詢到姓名的數據'},
]

通過這種方式,測試工程師只需輸入字段信息,即可輕松生成高質量的測試用例,大幅提升工作效率。


三、實戰演練:基于大模型升級查詢功能

結合上述邏輯,我們對用戶輸入進行處理,并生成測試用例。以下是具體代碼示例:

3.1 數據輸入

用戶輸入字段信息:

project = "客戶管理系統"
primary_module = "查詢功能"
sub_module = "客戶信息查詢"
case_creator = "測試工程師A"
check_result_method = "數據匹配"
ui_case_needed = "是"field_name = "姓名"
field_type = "字符串"
enums = None
symbol_date = None
date_ = None
symbol_time = None
time_ = None

3.2 提示詞構建

根據輸入信息構建提示詞:

prompt = (f'系統名稱為: {project};主功能模塊名稱為: {primary_module};子功能模塊為:{sub_module};'f'用例創建人為: {case_creator};'f'查詢結果比對方式為: {check_result_method};'f'查詢頁面是否需要補充UI測試用例: {ui_case_needed};自主標定用例的優先級;')prompt += f'字段名稱: {field_name};字段類型: {field_type};'

3.3 調用大模型生成測試用例

通過大模型接口生成測試用例:

async def generate_cases(prompt_param):# 初始化OpenAI客戶端client = OpenAI(# 如果沒有配置環境變量,請用百煉API Key替換:api_key="sk-xxx"# api_key='sk-xxx',api_key='sk-xxx',  # todo 此處需更換base_url="https://dashscope.aliyuncs.com/compatible-mode/v1")reasoning_content = ""  # 定義完整思考過程answer_content = ""  # 定義完整回復is_answering = False  # 判斷是否結束思考過程并開始回復example = [{'title': '根據姓名查詢'},{'steps': '1.進入頁面;\n2.在查詢條件姓名輸入;\n3.其他查詢條件保持默認;\n4.點擊查詢'},{'expect_results': '查詢到姓名的數據'},]# 創建聊天完成請求completion = client.chat.completions.create(model="deepseek-r1",  # 此處以 deepseek-r1 為例,可按需更換模型名稱messages=[{'role': 'user','content': f'你是一名資深測工程師,根據這些字段組合{prompt_param}生成查詢條件的組合,條件組合不能重復;輸出列表形式的JSON,示例:{example}'}],stream=True,# 解除以下注釋會在最后一個chunk返回Token使用量# stream_options={#     "include_usage": True# })print("\n" + "=" * 20 + "思考過程" + "=" * 20 + "\n")for chunk in completion:# 如果chunk.choices為空,則打印usageif not chunk.choices:print("\nUsage:")print(chunk.usage)else:delta = chunk.choices[0].delta# 打印思考過程if hasattr(delta, 'reasoning_content') and delta.reasoning_content != None:print(delta.reasoning_content, end='', flush=True)reasoning_content += delta.reasoning_contentelse:# 開始回復if delta.content != "" and not is_answering:print("\n" + "=" * 20 + "完整回復" + "=" * 20 + "\n")is_answering = True# 打印回復過程print(delta.content, end='', flush=True)answer_content += delta.contentreturn answer_content

四、Django 異步調用阿里云 DeepSeek-R1 API

為了在查詢功能升級中提升性能,我們可以采用 Django 異步調用阿里云 DeepSeek-R1 API。以下是具體實現步驟:

4.1 安裝依賴

pip install aiohttp

4.2 異步請求實現

通過 aiohttp 實現異步調用:

import aiohttp
import asyncioasync def generate_cases(prompt_param):# 初始化OpenAI客戶端client = OpenAI(# 如果沒有配置環境變量,請用百煉API Key替換:api_key="sk-xxx"# api_key='sk-xxx',api_key='sk-xxx',  # todo 此處需更換base_url="https://dashscope.aliyuncs.com/compatible-mode/v1")reasoning_content = ""  # 定義完整思考過程answer_content = ""  # 定義完整回復is_answering = False  # 判斷是否結束思考過程并開始回復example = [{'title': '根據姓名查詢'},{'steps': '1.進入頁面;\n2.在查詢條件姓名輸入;\n3.其他查詢條件保持默認;\n4.點擊查詢'},{'expect_results': '查詢到姓名的數據'},]# 創建聊天完成請求completion = client.chat.completions.create(model="deepseek-r1",  # 此處以 deepseek-r1 為例,可按需更換模型名稱messages=[{'role': 'user','content': f'你是一名資深測工程師,根據這些字段組合{prompt_param}生成查詢條件的組合,條件組合不能重復;輸出列表形式的JSON,示例:{example}'}],stream=True,# 解除以下注釋會在最后一個chunk返回Token使用量# stream_options={#     "include_usage": True# })print("\n" + "=" * 20 + "思考過程" + "=" * 20 + "\n")for chunk in completion:# 如果chunk.choices為空,則打印usageif not chunk.choices:print("\nUsage:")print(chunk.usage)else:delta = chunk.choices[0].delta# 打印思考過程if hasattr(delta, 'reasoning_content') and delta.reasoning_content != None:print(delta.reasoning_content, end='', flush=True)reasoning_content += delta.reasoning_contentelse:# 開始回復if delta.content != "" and not is_answering:print("\n" + "=" * 20 + "完整回復" + "=" * 20 + "\n")is_answering = True# 打印回復過程print(delta.content, end='', flush=True)answer_content += delta.contentreturn answer_content# 示例調用
async def search_page_generate_case_by_ai(request):print('開始進行異步大模型用例生成')if request.method == 'POST':case = Cases.objects.all()case_common_title = []case_common_steps = []case_common_expect_result = []total_len = len(request.POST)case_system = request.POST.get('auth')case_module = ''primary_module = request.POST.get("module1")sub_module = []for _ in range(2, 4):if request.POST.get(f"module{_}"):sub_module.append(request.POST.get(f"module{_}"))sub_module = ">>".join(sub_module)case_precondition = f'已登錄{case_module}系統'page_name = request.POST.get('page_name')check_result_method = request.POST.get("check_result_method")case_creator = request.POST.get('creator')ui_case_needed = request.POST.get('ui_case')field_count = (total_len - 10) // 7project = Project.objects.get(project_name=case_system)project_id = project.idif field_count > 1:field_name_list = []prompt = (f'系統名稱為: {project};主功能模塊名稱為: {primary_module};子功能模塊為:{sub_module};'f'用例創建人為: {case_creator};'f'查詢結果比對方式為: {check_result_method};'f'查詢頁面是否需要補充UI測試用例: {ui_case_needed};自主標定用例的優先級;')for i in range(field_count):field_name = request.POST.get(f'field_name{i}')field_type = request.POST.get(f'field_type{i}')enums = request.POST.get(f'enums{i}')symbol_date = request.POST.get(f'symbol_date{i}')date_ = request.POST.get(f'date{i}')symbol_time = request.POST.get(f'symbol_time{i}')time_ = request.POST.get(f'time{i}')time_ = str(time_).replace('T', ' ')field_name_list.append(field_name)# todo 修改此處適配AI大模型用例生成prompt += f'字段名稱: {field_name};字段類型: {field_type};'if enums:prompt += f'枚舉值:{enums};'elif symbol_date:prompt += f'日期符號為:{symbol_date};'elif date_:prompt += f'日期為:{date_};'elif symbol_time:prompt += f'時間比較符號為:{symbol_time};'elif time_:prompt += f'時間選定的值為:{time_};\n'deepseek_result = await generate_cases(prompt)return HttpResponse(deepseek_result)asyncio.run(main())

4.3 在 Django 中集成

將異步調用集成到 Django 視圖中:

@require_POST
async def search_page_generate_case_by_ai(request):print('開始進行異步大模型用例生成')if request.method == 'POST':case = Cases.objects.all()case_common_title = []case_common_steps = []case_common_expect_result = []total_len = len(request.POST)case_system = request.POST.get('auth')case_module = ''primary_module = request.POST.get("module1")sub_module = []for _ in range(2, 4):if request.POST.get(f"module{_}"):sub_module.append(request.POST.get(f"module{_}"))sub_module = ">>".join(sub_module)case_precondition = f'已登錄{case_module}系統'page_name = request.POST.get('page_name')check_result_method = request.POST.get("check_result_method")case_creator = request.POST.get('creator')ui_case_needed = request.POST.get('ui_case')field_count = (total_len - 10) // 7project = Project.objects.get(project_name=case_system)project_id = project.idif field_count > 1:field_name_list = []prompt = (f'系統名稱為: {project};主功能模塊名稱為: {primary_module};子功能模塊為:{sub_module};'f'用例創建人為: {case_creator};'f'查詢結果比對方式為: {check_result_method};'f'查詢頁面是否需要補充UI測試用例: {ui_case_needed};自主標定用例的優先級;')for i in range(field_count):field_name = request.POST.get(f'field_name{i}')field_type = request.POST.get(f'field_type{i}')enums = request.POST.get(f'enums{i}')symbol_date = request.POST.get(f'symbol_date{i}')date_ = request.POST.get(f'date{i}')symbol_time = request.POST.get(f'symbol_time{i}')time_ = request.POST.get(f'time{i}')time_ = str(time_).replace('T', ' ')field_name_list.append(field_name)# todo 修改此處適配AI大模型用例生成prompt += f'字段名稱: {field_name};字段類型: {field_type};'if enums:prompt += f'枚舉值:{enums};'elif symbol_date:prompt += f'日期符號為:{symbol_date};'elif date_:prompt += f'日期為:{date_};'elif symbol_time:prompt += f'時間比較符號為:{symbol_time};'elif time_:prompt += f'時間選定的值為:{time_};\n'deepseek_result = await generate_cases(prompt)return HttpResponse(deepseek_result)else:return HttpResponse("沒有內容!!!")

通過這種方式,Django 可以在處理查詢請求時避免主線程阻塞,從而提升系統的并發性能。


五、大模型與平臺升級的未來展望

通過大模型的引入,老舊平臺的查詢功能可以煥發新活力。測試工程師不僅能更高效地生成測試用例,還可以通過異步調用大模型接口,提升系統響應速度,為用戶提供更好的體驗。未來,隨著大模型和容器化技術的普及,本地部署和性能優化將成為測試領域的重要方向。

快將這些技術應用到你的項目中,讓測試工作更智能、更高效吧!

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

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

相關文章

基于javaweb的SpringBoot雪具商城系統設計與實現(源碼+文檔+部署講解)

技術范圍:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容:免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論…

【AI學習筆記】Coze平臺實現將Excel文檔批量導入數據庫全過程

背景前搖&原視頻教程: 最近看到很多同學都在用Coze平臺操作數據,我也想了解一下工作流的搭建和數據處理過程,但是一下子又看不懂太復雜的邏輯,于是上B站搜索相關的基礎教程。 Coze官方教程: 之前有看過Coze平臺…

【Axure高保真原型】縱向圖片輪播

今天和大家分享縱向圖片輪播的原型模版,載入后會自動循環輪播,鼠標移入圖片后停止輪播,可以通過點擊上下箭頭,向上或向下滑動切換上一張或下一張圖片,也可以點擊右側小圓點快速切換至對應圖片……具體效果可以打開下方…

力扣32.最長有效括號(棧)

32. 最長有效括號 - 力扣&#xff08;LeetCode&#xff09; 代碼區&#xff1a; #include<stack> #include<string> /*最長有效*/ class Solution { public:int longestValidParentheses(string s) {stack<int> st;int ans0;int ns.length();st.push(-1);fo…

如何在 React 項目中使用React.lazy和Suspense實現組件的懶加載?

大白話如何在 React 項目中使用React.lazy和Suspense實現組件的懶加載&#xff1f; 在 React 項目里&#xff0c;有時候組件功能多、體積大&#xff0c;要是一次性把所有組件都加載進來&#xff0c;網頁加載速度就會變慢。而 React 提供了 React.lazy 和 Suspense 這兩個好東西…

ffmpeg-將多個視頻切片成一個新的視頻

使用 ffmpeg 工具可以輕松完成將多個視頻切片合并為一個新的視頻。以下是實現這一目標的具體步驟和命令。 步驟概覽 1、將多個視頻切片。 2、創建文本文件列出切片的視頻片段。 3、使用 ffmpeg 合并這些切片為一個新的視頻。 一&#xff1a;安裝 ffmpeg 確保你的系統中已經安…

【第2月_day10】Pandas數據查看與選擇

以下是專為小白設計的 Pandas數據查看與選擇 學習內容&#xff0c;從基礎到應用逐步講解&#xff0c;附帶清晰示例和注意事項&#xff1a; 一、數據查看&#xff1a;快速了解你的數據 1. head() 和 tail() 作用&#xff1a;查看數據的前幾行或后幾行&#xff0c;默認顯示5行。…

Jetpack LiveData 使用與原理解析

一、引言 在 Android 開發中&#xff0c;數據的變化需要及時反映到界面上是一個常見的需求。然而&#xff0c;傳統的方式可能會導致代碼復雜、難以維護&#xff0c;并且容易出現內存泄漏等問題。Jetpack 組件中的 LiveData 為我們提供了一種優雅的解決方案&#xff0c;它是一種…

Unity2D 五子棋 + Photon聯網雙人對戰

開發環境配置 Unity版本2022.3 創建Photon賬號以及申請Photon中國區服務 官網申請賬號&#xff1a;Multiplayer Game Development Made Easy Photon Engine 中國區服務&#xff1a; 光子引擎photonengine中文站 成都動聯無限科技有限公司(vibrantlink.com) 導入PUN2插件以及…

(UI自動化測試web端)第二篇:元素定位的方法_css定位之屬性選擇器

看代碼里的【find_element_by_css_selector( )】( )里的表達式怎么寫&#xff1f; 文章介紹了第四種寫法屬性選擇器 &#xff0c;你要根據網頁中的實際情況來判斷自己到底要用哪一種方法來進行元素定位。每種方法都要多練習&#xff0c;全都熟了之后你在工作當中使用起來元素定…

預編譯能否 100%防 sql 注入?

&#x1f31f; 什么是 SQL 注入&#xff1f; SQL 注入&#xff08;SQL Injection&#xff09;是指攻擊者利用特殊輸入&#xff0c;讓數據庫執行它本來不應該執行的代碼&#xff0c;從而獲取或篡改數據。 就像在考試的時候偷偷改題目&#xff0c;讓老師改成你想要的內容&#…

第十五章 | Layer2、Rollup 與 ZK 技術實戰解析

&#x1f4da; 第十五章 | Layer2、Rollup 與 ZK 技術實戰解析 ——構建下一代高性能區塊鏈應用&#xff0c;從 Solidity 到 zkSync&#xff01; ? 本章導讀 Layer2 和零知識證明&#xff08;ZK&#xff09;正成為區塊鏈發展的核心方向。 隨著主網 Gas 居高不下、TPS 無法滿…

2025-03-26 學習記錄--C/C++-PTA 6-3 求鏈式表的表長

合抱之木&#xff0c;生于毫末&#xff1b;九層之臺&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、題目描述 ?? 6-3 求鏈式表的表長 本題要求實現一個函數&#xff0c;求鏈式表的表長。 函數接口定義&#xff1a; &…

【Linux】Linux_Ubuntu與Windows之間的文件傳輸

一、Linux終端命令的復制粘貼 1.打開linux 終端&#xff0c;輸入以下命令&#xff1a;&#xff08;注意&#xff0c;需要聯網&#xff09; 2.命令行下載&#xff1a; sudo apt-get autoremove open-vm-tools 3.命令行安裝&#xff1a; sudo apt-get install open-vm-tools-…

Python Sanic面試題及參考答案

目錄 Sanic 的事件循環機制與 uvloop 的關系 Sanic 的 Request/Response 對象生命周期如何管理?如何訪問請求上下文? 對比 Sanic 與 Flask/Django 的異步處理模型差異 Sanic 的 Blueprint 機制如何實現模塊化路由?如何處理跨藍圖中間件? 如何在 Sanic 中實現 WebSocket…

算法每日一練 (18)

&#x1f4a2;歡迎來到張翊塵的技術站 &#x1f4a5;技術如江河&#xff0c;匯聚眾志成。代碼似星辰&#xff0c;照亮行征程。開源精神長&#xff0c;傳承永不忘。攜手共前行&#xff0c;未來更輝煌&#x1f4a5; 文章目錄 算法每日一練 (18)刪除并獲得點數題目描述解題思路解題…

VsCode啟用右括號自動跳過(自動重寫) - 自錄制gif演示

VsCode啟用右括號自動跳過(自動重寫) - 自錄制gif演示 前言 不知道大家在編程時候的按鍵習慣是怎樣的。輸入完左括號后編輯器一般會自動補全右括號&#xff0c;輸入完左括號的內容后&#xff0c;是按→跳過右括號還是按)跳過右括號呢&#xff1f; for (int i 0; i < a.s…

用Python和Stable Diffusion生成AI動畫:從圖像到視頻的全流程指南

引言 本文將演示如何通過Python代碼實現基于文本提示的AI動畫生成。我們將使用Stable Diffusion生成連貫圖像幀,結合OpenCV合成視頻,最終實現一個可自定義的動畫生成 pipeline。 一、環境準備 1. 依賴安裝 # 安裝核心庫 pip install diffusers transformers torch numpy …

【Git 常用指令速查表】

Git 常用指令速查表 Git 常用指令速查表目錄1. 初始化倉庫2. 提交代碼流程3. 分支管理4. 遠程倉庫操作5. 撤銷操作6. 查看狀態與日志7. 其他實用指令完整操作示例常用場景速查表 Git 常用指令速查表 目錄 初始化倉庫提交代碼流程分支管理遠程倉庫操作撤銷操作查看狀態與日志其…

分布式爬蟲框架Scrapy-Redis實戰指南

引言 在當今數字化的時代背景下&#xff0c;互聯網技術的蓬勃興起極大地改變了旅游酒店業的運營模式與市場格局。作為旅游產業鏈中的關鍵一環&#xff0c;酒店業的興衰與互聯網技術的應用程度緊密相連。分布式爬蟲技術&#xff0c;尤其是基于 Scrapy 框架的 Scrapy-Redis 擴展…