記一次演算法在日常測試工作中的應用!絕對史無前例。

我去熱飯發表於2020-12-03

誰說演算法在測試領域無用? 我昨天就遇到了一個很噁心的技術問題:

這是一個漢字字串: "銀行卡測試"

我要求出他的拼音首字母組合,

預期:"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,寫演算法對我們測試沒有用了。

相關文章