AI 實踐探索:輔助生成測試用例

背景

目前我們的測試用例主要依賴人工生成和維護,AI時代的來臨,我們也在思考“AI如何賦能業務”,提出了如下命題:

“探索通過AI輔助生成測試用例,完成從需求到測試用例生成的穿刺”。

目標

  • 找全測試路徑
  • 輔助生成測試用例

實踐案例:登錄注冊流程

自然語言描述需求

需求名稱:注冊登錄流程
需求描述:
1、注冊和登錄在同一個頁面,有2個按鈕,一個注冊,一個登錄,用戶輸入用戶名、密碼進行登錄或者注冊
2、首頁:加載一張圖,有個退出按鈕,點擊則退出首頁

注:這里只是為了驗證思路,需求描述會比較簡單,實際需求考慮會更完善。

如何找全測試路徑

使用LLM生成mermaid格式的狀態機描述

使用Dify 搭建的工作流:

將前面的需求描述作為輸入參數,提供Prompt模板告訴LLM,如下所示:
在這里插入圖片描述

LLM 生成的mermaid 狀態機描述:

stateDiagram-v2[*] --> UnregisteredUnregistered --> Registering: start_registerRegistering --> Unregistered: register_failedRegistering --> LoggingIn: register_successUnregistered --> LoggingIn: start_loginLoggingIn --> Unregistered: login_failedLoggingIn --> LoggedIn: login_successLoggedIn --> Unregistered: logoutLoggedIn --> [*]: exit

Markdown對mermaid支持友好,可以直接渲染成狀態機圖:
在這里插入圖片描述

這里選擇Mermaid來描述狀態機的理由,主要是Mermaid天然適合文檔化,代碼輕量且無額外依賴,無需處理圖片格式的一些問題。

參考:AI大模型生成的圖表為什么傾向使用Mermaid格式?

使用AI幫我們開發工具

前面通過LLM能夠幫我們理解需求生成狀態機圖,如果想基于狀態機找全測試路徑,我們嘗試使用AI編程工具來輔助生成規則工具,來確保每次遍歷的路徑是一致的。

比如Cursor:

通過多輪的對話和人工修正,Cursor能夠很高效的幫助我生成符合預期的代碼,但仍需要人工去驗證和調試。

核心路徑生成算法:

from typing import List, Dict, Set
from abc import ABC, abstractmethodclass PathGeneratorBase(ABC):def __init__(self):self.graph = {}self.paths = []self.events = {}@abstractmethoddef parse_input(self):"""解析輸入源(Mermaid或SCXML)"""passdef generate_paths(self, max_depth: int = 15) -> List[List[str]]:"""通用的路徑生成算法"""paths = []start = self._find_start_state()visited_states = set()def dfs(current: str, path: List[str]):if len(path) > max_depth:returncurrent_transitions = self._get_transitions(current)if self._should_terminate(current, path, current_transitions):paths.append(path[:])returnvisited_states.add(current)for next_state in current_transitions:dfs(next_state, path + [next_state])visited_states.remove(current)dfs(start, [start])return self._deduplicate_paths(paths)def _find_start_state(self) -> str:"""查找起始狀態"""if 'START' in self.graph:return 'START'in_degrees = self._calculate_in_degrees()for node, degree in in_degrees.items():if degree == 0:return nodereturn Nonedef _get_transitions(self, state: str) -> List[str]:"""獲取狀態的所有可能轉換"""if state not in self.graph:return []return [target for target in self.graph[state]]def _should_terminate(self, current: str, path: List[str], transitions: List[str]) -> bool:"""判斷是否應該終止當前路徑"""return len(path) > 1 and (not transitions or current in path[:-1])def _deduplicate_paths(self, paths: List[List[str]]) -> List[List[str]]:"""去除重復路徑"""unique_paths = []path_strings = set()for path in sorted(paths, key=len):path_str = "->".join(path)if path_str not in path_strings:path_strings.add(path_str)unique_paths.append(path)return unique_pathsdef calculate_coverage(self) -> Dict:"""計算測試覆蓋率"""all_states = set(self.graph.keys())all_transitions = set()covered_states = set()covered_transitions = set()for path in self.paths:covered_states.update(path)for i in range(len(path) - 1):transition = (path[i], path[i + 1])covered_transitions.add(transition)all_transitions.add(transition)return {"state_coverage": len(covered_states) / len(all_states) * 100,"transition_coverage": len(covered_transitions) / len(all_transitions) * 100}

根據路徑生成算法遍歷生成的路徑索引:

如何生成測試用例

用例關鍵要素

  • 前置條件:描述復現測試場景所需的條件;
  • 操作步驟:描述測試場景下用戶的操作行為;
  • 預期結果:描述測試場景下,用戶執行完操作預期得到的結果。

示例:

場景前置條件操作步驟預期結果
銀行卡支付場景用戶已綁定有效銀行卡在收銀臺選擇銀行卡支付顯示支付成功頁面,賬戶余額減少相應金額

LLM 生成測試用例

工作流設計:

  1. 輸入需求描述和測試路徑
  2. 設計prompt提示詞,要求LLM按固定格式輸出測試用例

生成的測試用例結果示例:

[{"precondition": "用戶未注冊,系統處于未登錄狀態","operation_procedure": ["1. 訪問系統首頁","2. 輸入用戶名:a1_(3字符)","3. 輸入密碼:Passw0rd!","4. 點擊'注冊'按鈕"],"expected_result": ["注冊失敗,提示'用戶名長度需在4-20字符之間'","頁面停留在注冊/登錄頁面"]},{"precondition": "用戶未注冊,系統處于未登錄狀態","operation_procedure": ["1. 訪問系統首頁","2. 輸入用戶名:existing_user","3. 輸入密碼:Passw0rd!","4. 點擊'注冊'按鈕","5. 再次輸入相同用戶名和密碼點擊'注冊'按鈕"],"expected_result": ["第二次注冊時提示'用戶名已存在'","頁面停留在注冊/登錄頁面"]},{"precondition": "用戶未注冊,系統處于未登錄狀態","operation_procedure": ["1. 訪問系統首頁","2. 輸入用戶名:user😊name","3. 輸入密碼:Passw0rd!","4. 點擊'注冊'按鈕"],"expected_result": ["注冊失敗,提示'用戶名包含非法字符'","頁面停留在注冊/登錄頁面"]},{"precondition": "用戶未注冊,系統處于未登錄狀態","operation_procedure": ["1. 訪問系統首頁","2. 輸入不存在的用戶名:new_user","3. 輸入錯誤密碼:wrongPass","4. 點擊'登錄'按鈕"],"expected_result": ["登錄失敗,提示'用戶名或密碼錯誤'","頁面停留在注冊/登錄頁面"]},{"precondition": "用戶已注冊,系統處于未登錄狀態","operation_procedure": ["1. 訪問系統首頁","2. 輸入已注冊用戶名:valid_user","3. 輸入正確密碼:Passw0rd!","4. 點擊'登錄'按鈕"],"expected_result": ["登錄成功,跳轉至帶圖片的首頁","頁面顯示退出按鈕"]},{"precondition": "新用戶完成注冊,系統處于未登錄狀態","operation_procedure": ["1. 訪問系統首頁","2. 輸入符合要求的用戶名:new_user_123","3. 輸入符合要求的密碼:Passw0rd!","4. 點擊'注冊'按鈕","5. 使用相同憑證點擊'登錄'按鈕"],"expected_result": ["注冊成功后自動清除表單","登錄成功跳轉至首頁"]},{"precondition": "用戶已登錄,處于首頁","operation_procedure": ["1. 點擊'退出'按鈕"],"expected_result": ["返回注冊/登錄頁面","用戶會話終止"]},{"precondition": "用戶未注冊,系統處于未登錄狀態","operation_procedure": ["1. 訪問系統首頁","2. 輸入有效用戶名:valid_user","3. 輸入無效密碼:password","4. 點擊'注冊'按鈕"],"expected_result": ["注冊失敗,提示'密碼需包含大寫字母、小寫字母、數字和特殊字符'","頁面停留在注冊/登錄頁面"]}
]

這里可以進一步將json數據轉成xmind或excel格式的文件。

收益

價值思考? 幾個方向:

  • AI輔助建模(狀態機、類圖),提升研發需求建模效率和規范
  • 釋放助理生成測試用例的生產力,轉變為review/修改用例的角色
  • AI輔助生成符合業務規則的可測試數據,提升構造數據的效率

經驗總結

  • 使用AI幫助我們進行自然語言推理和圖解析
  • 要讓AI生成的測試用例更準確,需要精確描述需求,對需求進行建模,描述清楚業務規則
  • 使用AI編程工具幫助我們開發工具,比如有明確規則的工具開發
  • 通過搭建AI工作流完成需求穿刺

附錄

  • Dify文檔: https://docs.dify.ai/zh-hans

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

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

相關文章

C#實現訪問遠程硬盤(附源碼)

在現實場景中,我們經常用到遠程桌面功能,而在某些場景下,我們需要使用類似的遠程硬盤功能,這樣能非常方便地操作對方電腦磁盤的目錄、以及傳送文件。那么,這樣的遠程硬盤功能要怎么實現了? 這次我們將給出…

02.Golang 切片(slice)源碼分析(一、定義與基礎操作實現)

Golang 切片(slice)源碼分析(一、定義與基礎操作實現) 注意當前go版本代碼為1.23 一、定義 slice 的底層數據是數組,slice 是對數組的封裝,它描述一個數組的片段。兩者都可以通過下標來訪問單個元素。 數…

記參加一次數學建模

題目請到全國大學生數學建模競賽下載查看。 注:過程更新了很多文件,所有這里貼上的有些內容不是最新的(而是草稿)。 注:我們隊伍并沒有獲獎,文章內容僅供一樂。 從這次比賽,給出以下賽前建議 …

virtualbox虛擬機中的ubuntu 20.04.6安裝新的linux內核5.4.293 | 并增加一個系統調用 | 證書問題如何解決

參考文章:linux添加系統調用【簡單易懂】【含32位系統】【含64位系統】_64位 32位 系統調用-CSDN博客 安裝新內核 1. 在火狐下載你需要的版本的linux內核壓縮包 這里我因為在windows上面下載過,配置過共享文件夾,所以直接復制粘貼通過共享文…

[Java實戰]Spring Boot 3 整合 Ehcache 3(十九)

[Java實戰]Spring Boot 3 整合 Ehcache 3(十九) 引言 在微服務和高并發場景下,緩存是提升系統性能的關鍵技術之一。Ehcache 作為 Java 生態中成熟的內存緩存框架,其 3.x 版本在性能、功能和易用性上均有顯著提升。本文將詳細介紹…

LlamaIndex 第九篇 Indexing索引

索引概述 數據加載完成后,您將獲得一個文檔對象(Document)列表(或節點(Node)列表)。接下來需要為這些對象構建索引(Index),以便開始執行查詢。 索引(Index) 是一種數據結構,能夠讓我們快速檢索…

【問題排查】easyexcel日志打印Empty row!

問題原因 日志打印??I/O 操作開銷?(如 Log4j 的 FileAppender)會阻塞業務線程,直到日志寫入完成,導致接口響應變慢 問題描述 在線上環境,客戶反饋導入一個不到1MB的excel文件,耗時將近5分鐘。 問題排…

代碼隨想錄第51天|島嶼數量(深搜)、島嶼數量(廣搜)、島嶼的最大面積

1.島嶼數量&#xff08;深搜&#xff09; ---》模板題 版本一寫法&#xff1a;下一個節點是否能合法已經判斷完了&#xff0c;傳進dfs函數的就是合法節點。 #include <iostream> #include <vector> using namespace std;int dir[4][2] {0, 1, 1, 0, -1, 0, 0, -…

Made with Unity | 從影視到游戲:《魷魚游戲》IP 的邊界拓展

優質IP的跨媒體開發潛力不可限量。以現象級劇集《魷魚游戲》為例&#xff0c;Netflix旗下游戲工作室Boss Fight在第二季開播前夕推出的手游《Squid Game: Unleashed》&#xff0c;一經發布便橫掃全球107個國家和地區的App Store免費游戲榜首。 這款多人派對大逃殺游戲完美還原…

allure 報告更改標題和語言為中文

在網上看到好多談到更改allure 的標題設置都很麻煩&#xff0c;去更改JSON文件 其實可以有更簡單的辦法&#xff0c;就是在生成報表時增加參數 使用allure --help 查看&#xff1a; --lang, --report-language 設置報告的語言&#xff0c;默認是應用 The report language. …

HGDB索引膨脹的檢查與處理思路

文章目錄 環境文檔用途詳細信息 環境 系統平臺&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;4.5.8 文檔用途 本文檔主要介紹HGDB索引膨脹的定義、產生的原因、如何檢查以及遇到索引膨脹如何處理&#xff08;包括預防和解決&#xff09; 詳細信息 …

【Python CGI編程】

Python CGI&#xff08;通用網關接口&#xff09;編程是早期Web開發中實現動態網頁的技術方案。以下是系統化指南&#xff0c;包含核心概念、實現步驟及安全實踐&#xff1a; 一、CGI 基礎概念 1. 工作原理 瀏覽器請求 → Web服務器&#xff08;如Apache&#xff09; → 執行…

數據庫故障排查指南:從入門到精通

1. 常見數據庫故障類型 1.1 連接故障 數據庫連接超時連接池耗盡網絡連接中斷認證失敗1.2 性能故障 查詢執行緩慢內存使用過高CPU使用率異常磁盤I/O瓶頸1.3 數據故障 數據不一致數據丟失數據損壞事務失敗2. 故障排查流程 2.1 初步診斷 -- 檢查數據庫狀態SHOW STATUS;SHOW PRO…

conda創建環境常用命令(個人用)

創建環境 conda create --name your_project_name創建環境 ---- 指定環境python版本 conda create --name your_project_name python3.x環境列表 conda env list激活環境 conda activate your_project_name退出環境 conda deactivate環境列表 #使用conda命令 conda list …

PCL 繪制二次曲面

文章目錄 一、簡介二、實現代碼三、實現效果一、簡介 這里基于二次曲面的公式: z = a 0 + a 1 x + a 2 y + a

一文講透面向對象編程OOP特點及應用場景

面向對象編程&#xff08;Object-Oriented Programming, OOP&#xff09;是一種以對象為核心、通過類組織代碼的編程范式。它通過模擬現實世界的實體和交互來構建軟件系統&#xff0c;是現代軟件開發中最廣泛使用的范式之一。以下是 OOP 的全面解析&#xff1a; 一、OOP 的四大…

linux,我啟動一個springboot項目, 用java -jar xxx.jar ,但是沒多久這個java進程就會自動關掉

當使用 java -jar xxx.jar & 啟動 Spring Boot 項目后進程自動關閉時&#xff0c;可能由多種原因導致。以下是常見排查步驟和解決方案&#xff1a; 一、查看日志定位原因 進程異常關閉通常會在控制臺或日志中留下線索&#xff0c;建議先獲取完整日志&#xff1a; 1. 查看…

【獨家精簡】win11(24h2)清爽加速版

自作該版本的初心&#xff1a;隨著電腦性能的不斷提升&#xff0c;我們需要的更多的是沒有廣告&#xff0c;沒有推薦&#xff0c;沒有收集隱私的windows清爽版純凈系統 目前只會去制作windows系統專業版 1、去除Windows系統自帶的廣告新聞和推薦以及小組間和聊天功能。 2、精簡…

大二java第一面小廠(掛)

第一場&#xff1a; mybatis怎么防止數據轉義。 Hutool用的那些你常用的方法。 springboot的常用注解。 redis的多級緩存。 websocket怎么實現的多人協作編輯功能。 怎么實現的分庫分表。 mysql里面的各種操作&#xff0c;比如說分表怎么分&#xff0c;分頁查詢怎么用。 mybat…

OceanBase 的系統變量、配置項和用戶變量有何差異

在繼續閱讀本文之前&#xff0c;大家不妨先思考一下&#xff0c;數據庫中“系統變量”、“用戶變量”以及“配置項”這三者之間有何不同。如果感到有些模糊&#xff0c;那么本文將是您理清這些概念的好幫手。 很多用戶在使用OceanBase數據庫中的“配置項”和“系統變量”&#…