記一次演算法在日常測試工作中的應用!絕對史無前例。
誰說演算法在測試領域無用? 我昨天就遇到了一個很噁心的技術問題:
這是一個漢字字串: "銀行卡測試"
我要求出他的拼音首字母組合,
預期:"yhkcs"
實際:"yhqcs"
沒錯,它含有一個多音字:卡
念ka 或者 qia
我的需求就變成了:我要獲取它所有可能的首字母組合,放到一個大列表中。
通過第三方pinyin庫,我成功的拿到了他們首字母組成的二維陣列,每個元素就是一個字的首字母列表:
"銀行卡測試" = [['y'],['h'],['q','k'],['c'],['s']]
這個的最終結果應該是:
['yhqcs','yhkcs'] 長度為2
當然,換一個多個多音字的:
"長卡測" = [['c','z'],['q','k'],['c']]
預期結果:
['cqc','ckc','zqc','zkc'] 長度為4
最終元素總個數為每個子列表長度的乘積。
當然還有更復雜的:
[['a','b','c','d'],['e','f','g'],['h','i']]
這個預期大列表的長度應該是 4*3*2 = 24
那麼以上的需求用程式碼如何實現?
苦思冥想,寫出了一套演算法,我覺得我應該是唯一一個這麼寫的:
from allpairspy import AllPairs
old = [['a','b','c','d'],['e','f','g'],['h','i']]
ready = []
for pairs in AllPairs(old[:2]):
ready.append(''.join(pairs))
for i in range(2, len(old)):
new_r= []
for pairs in AllPairs([ready, old[i]]):
new_r.append(''.join(pairs))
ready=new_r
print(ready)
print(len(ready))
一點問題沒有。
至於為什麼我會想出這個解決辦法呢?
我給大家說一下思路,非常有意思
首先我覺得直接去寫遞迴 很麻煩。效率也不行,就想著有沒有野路子搞定。
然後突然想到,這一個一個的子列表,就好像是我們測試中面對一個功能介面
上的一個一個多選輸入框,而子列表內不確定數量的字母,就像是這些多選框內的子選項。
我們平時遇到要測試這種功能的時候,要怎麼做呢?目的就是要儘可能的測出所有組合情況!
即每個下拉多選框只能選一個。多個框的各種組合我都要測到。
他們之間很明顯沒有任何邏輯強關聯,這時我們應該首選 黑盒用例設計方法中的 正交!
是的正交,它可以自動生成各種情況對應的組合,每種組合就是一條最終用例!
但是!
正交演算法的出現 就是為了避免窮盡測試,而我這次的需求就是要窮盡所有可能組合。
所以正交演算法要稍微改一改了,畢竟這個第三方演算法效能很好,我利用上效能絕對錯不了!
正交的基本原則是 保證多個輸入條件中,任何一個的子狀態,和任何另外一個輸入中的子狀態 都同時出現過 即可。最終正交演算法出來的所有組合數量,肯定是遠小於全部組合的。
比如:
[['a','b'],['c','d'],['e','f']]
窮盡的數量應該是:2*2*2 = 8
而正交演算法的數量:
['a', 'c', 'e']
['b', 'd', 'e']
['b', 'c', 'f']
['a', 'd', 'f']
最終4種,這4種你可以發現,任何倆個子列表的任何子元素都同時出現過。
比如:a 和f ,有。
d和e 也有。
所以正交演算法是為了降低我們測試用例數量,但又保證全面覆蓋的東西。
但是這裡我們要如何應用它以便讓其變成輸出窮盡所有的 8種結果呢?
很簡單,當只有倆個子列表,也就是隻有倆個輸入的時候。那麼此時,正交演算法的結果和窮盡結果 是完全相等的。
也就是說,我這個需求雖然可能有4個甚至更多個子列表,但是我只要用正交演算法每次只算其中倆個子列表的窮盡,然後再把這個窮盡的結果當作一個新的子列表,再去和另一個新的子列表去計算窮盡,然後再把結果當作一個新的子列表再去和下一個子列表計算窮盡,直到沒有子列表了,這時候的新的子列表就是最終結果!
大家是不是看到比較繞?
我用圖來說明:
每次這樣疊加算出後 最後就是最終結果。安全快捷準確!
然後就成了最上面的我分享的那個最終演算法。
有興趣的可以試試。當然我覺得 我應該是唯一一個靠 這麼曲線救國的做法的測試了吧。
能想出這個方法,首先要感謝
我龐大精通的測試理論基礎:黑盒測試用例設計方法-正交法
研究過正交的第三方python函式: allpairspy
長年刷leetcode練就的騷操作思維
所以小夥伴們,千萬不要再說刷leetcode,寫演算法對我們測試沒有用了。
相關文章
- Shell在日常工作中的應用實踐
- 史無前例:Nature Medicine同期8篇論文,聚焦人工智慧在醫學領域的應用人工智慧
- ES6 在日常工作中的運用
- 2020年開發者、設計師、測試員的數量將達到史無前例的高度–資訊圖
- 日常辦公怎麼選?A10/i5應用對比測試
- JDBC 在效能測試中的應用JDBC
- 單元測試在Unity中的應用Unity
- BurpSuite在非Web應用測試中的應用UIWeb
- 《WEB應用測試》筆記(五)Web筆記
- 【星雲測試】開發者測試-採用精準測試工具對Spring Boot應用進行測試Spring Boot
- 【星雲測試】開發者測試-採用精準測試工具對SpringBoot應用進行測試Spring Boot
- 開發者測試-採用精準測試工具對Spring Boot應用進行測試Spring Boot
- 【原創】記一次對X呼APP的滲透測試APP
- 代理IP在日常生活中的應用
- 自動化測試在國際軟體測試中的應用
- Mock技術在測試領域的應用Mock
- 測試金字塔新解之移動無線應用測試
- 開發者測試(4)-採用精準測試工具對dubbo微服務應用進行測試微服務
- 對稱加密演算法在C#中的踩坑日常加密演算法C#
- 在.Net中json應用測試整理JSON
- 【星雲測試】開發者測試(3)-採用精準測試工具對springcloud微服務應用進行穿透測試SpringGCCloud微服務穿透
- 記一次對Java多執行緒記憶體可見性的測試Java執行緒記憶體
- 開發者測試(3)-採用精準測試工具對springcloud微服務應用進行穿透測試SpringGCCloud微服務穿透
- Fuzzing測試中對於SPIKE框架的應用(一)框架
- 軟體測試工作中對問題的發現和改進
- 數字證書及其在安全測試中的應用
- 前沿探索|AI 在 API 開發測試中的應用AIAPI
- 速度提高几百倍,記一次資料結構在實際工作中的運用資料結構
- 淺談工作中的軟體測試
- 2款AI晶片、深度學習框架MindSpore:華為史無前例集中釋出AI戰略AI晶片深度學習框架
- TCL指令碼語言在測試系統中的應用指令碼
- 六西格瑪在日常生活中的應用體現
- 記一次授權滲透測試
- 移動應用的測試策略與測試架構架構
- 如何測試 Flutter 應用? ー 單元測試Flutter
- 驗證碼處理在自動化測試中的應用
- 用雲壓力測試工具,如何完成一次測試任務
- 記一次簡單的vue元件單元測試Vue元件