在測試工作中,查詢功能是各類系統的核心模塊,傳統的測試用例編寫往往耗時且重復。如何讓老舊平臺煥發新活力?本文將結合大模型技術,通過用戶輸入的字段信息,自動化生成高效、精準的測試用例。同時,我們還將介紹如何在 Django 框架中異步調用阿里云的 DeepSeek-R1 API,避免阻塞主線程,從而進一步提升系統性能。點擊底部小卡片了解更多AI測試話題。
一、傳統查詢功能的痛點
在老舊平臺中,查詢功能面臨以下問題:
- 測試用例編寫耗時:每次需求變更后,測試用例需要手動更新,效率低下。
- 用例質量參差不齊:測試人員的理解差異導致用例覆蓋率和場景設計不足。
- 缺乏智能化:無法根據用戶輸入的字段信息自動生成測試用例,適應動態變化的需求。
二、大模型驅動的查詢功能升級
2.1 升級方案概述
通過將用戶輸入的字段名稱、字段類型、字段值等信息傳遞給大模型,我們可以自動生成符合標準的測試用例。以下是升級的基本邏輯:
-
用戶輸入查詢條件(字段名稱、類型、值等)。
-
系統將輸入的信息封裝為提示詞(Prompt),并發送給大模型。
-
大模型根據模板自動生成測試用例,包括查詢步驟和預期結果。 真拿來即用!
[{"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 可以在處理查詢請求時避免主線程阻塞,從而提升系統的并發性能。
五、大模型與平臺升級的未來展望
通過大模型的引入,老舊平臺的查詢功能可以煥發新活力。測試工程師不僅能更高效地生成測試用例,還可以通過異步調用大模型接口,提升系統響應速度,為用戶提供更好的體驗。未來,隨著大模型和容器化技術的普及,本地部署和性能優化將成為測試領域的重要方向。
快將這些技術應用到你的項目中,讓測試工作更智能、更高效吧!