【目標(biāo)】:讓機(jī)器像人一樣去測試未知的web頁面。(這里變換一下思路治筒,其實(shí)是研究基于人工智能的用例生成系統(tǒng))
【涉及到的問題】:驅(qū)動機(jī)器去測試的一些列動作邏輯從何而來屉栓?每個動作所攜帶的數(shù)據(jù)入口在哪兒?
【涉及到的難點(diǎn)】:如何讓機(jī)器像人一樣去理解新頁面耸袜,如何讓機(jī)器使用動作邏輯+數(shù)據(jù)對頁面進(jìn)行測試友多?斷言該怎么引入?
【探索的方向】:????1.? ? 基于前端埋點(diǎn)的數(shù)據(jù)大量收集整理???? 2. 模型驅(qū)動方法? ? 3.監(jiān)督學(xué)習(xí)下的圖像識別分析方法 ...(如有不同見解請留下寶貴意見)
下面結(jié)合問題堤框、難點(diǎn)對探索方向做進(jìn)一步的分析:
埋點(diǎn)+大數(shù)據(jù)歸類分析
該方法的大前提是在線上環(huán)境的源碼中“插樁”域滥,植入一段js,將用戶操作時的一系列動作軌跡和結(jié)果信息保存下來蜈抓,回傳給數(shù)據(jù)庫启绰,這樣做最終問題留給了數(shù)據(jù)分析,期望從一堆雜亂的數(shù)據(jù)中去抽取大概率的路徑覆蓋沟使,這樣做的結(jié)果會有3方面問題:
1.? ? 源碼插樁委可,開發(fā)會考慮性能問題;屬于強(qiáng)行介入式的,簡單粗暴着倾;不易達(dá)成共識拾酝;
2.? ? 用戶尚若發(fā)現(xiàn)自己的操作持續(xù)被窺探中,后果將不堪設(shè)想卡者;信息外泄事情就更大了蒿囤;因此這個方案看似簡單,實(shí)則考慮甚廣崇决;
3.? ? 一堆雜亂的使用數(shù)據(jù)沒有先后順序材诽,諸如先干啥后干啥此類信息不明;全為并列關(guān)系恒傻;
4.? ? 最核心的問題來了脸侥,即使是大量用戶使用也無法做到功能的全覆蓋,換句話說碌冶,用戶只是使用了自己認(rèn)為最常用的那些功能湿痢,而沒用到的功能或者沒有走過的路徑不敢保證其沒有問題;漏測扑庞。
模型驅(qū)動
模型的目的就是用來為構(gòu)造測試用例而進(jìn)行的被測系統(tǒng)描述譬重。一個測試模型可以由箭頭和節(jié)點(diǎn)組成如下圖所示:
Start頂點(diǎn):? ? start頂點(diǎn)不是必需的。如果使用栅隐,則必須有1個(且只有1個)頂點(diǎn)名稱為:start.
從start頂點(diǎn)出發(fā)只能有1個邊塔嬉。start頂點(diǎn)不會包括在任何生成的測試路徑中,它只表示一個開始位租悄。
頂點(diǎn)或邊的名字(name):? ? 名稱是第一個單詞谨究,位于標(biāo)簽中邊或頂點(diǎn)的第一行。
標(biāo)簽(Lable):? ? 標(biāo)簽是點(diǎn)或邊上的所有文字描述泣棋。
守衛(wèi)(Guards)僅用于Edge:? ? 守衛(wèi)guard是一種只與邊相關(guān)的機(jī)制胶哲。他們的角色與if語句相同,并且使邊有資格或者沒有資格被訪問潭辈。守衛(wèi)guard是一個用方括號括起來的JavaScript條件表達(dá)式只有一個鸯屿。[loggedIn == true]上面意味著如果屬性loggedIn等于true,則邊是可訪問的把敢。
操作(Action)僅用于Edge:? ? 動作是僅與邊相關(guān)聯(lián)的機(jī)制寄摆。這是我們要在模型中執(zhí)行的JavaScript代碼。它放在正斜杠之后修赞。Action可以有多個婶恼,每個語句必須以分號結(jié)尾。/loggedIn=false; rememberMe=true; action是動作代碼,它的執(zhí)行結(jié)果將作為數(shù)據(jù)傳遞給守衛(wèi)勾邦。
路徑生成器:? ??生成器是決定如何遍歷模型的算法联逻。不同的生成器將生成不同的測試序列,并且它們將以不同的方式遍歷模型检痰。多個發(fā)生器可以串聯(lián)。
random( some stop condition(s) )
以完全隨機(jī)的方式瀏覽模型锨推。也稱為“醉漢走路”或“隨機(jī)步行”铅歼。該算法通過隨機(jī)從頂點(diǎn)選擇出邊,并且在下一個頂點(diǎn)時重復(fù)此過程换可。
quick_random( some stop condition(s) )
嘗試運(yùn)行通過模型的最短路徑椎椰,但以快速的方式。這是算法的工作原理:
1.????選擇一個尚未被隨機(jī)訪問的邊沾鳄。
2.????使用Dijkstra算法選擇到該邊緣的最短路徑
3.????走該路徑慨飘,并將所有執(zhí)行的邊標(biāo)記為已訪問。
4.????當(dāng)在步驟1中達(dá)到選定的邊緣時译荞,從頭開始瓤的,重復(fù)步驟1-> 4。
該算法對于非常大的模型工作良好吞歼,并且生成合理的短序列圈膏。缺點(diǎn)是當(dāng)與EFSM結(jié)合使用時。該算法可以選擇被守衛(wèi)block的路徑篙骡。
a_star( a stop condition that names a vertex or an edge )
將生成到特定頂點(diǎn)或邊的最短路徑稽坤。
shortest_all_paths ==> (Not released yet)
將計(jì)算并生成通過模型的最短路徑。每個邊緣的成本設(shè)置為1. 不建議使用此算法糯俗,因?yàn)閷τ谳^大的模型尿褪,并且使用模型(EFSM)中的數(shù)據(jù),將需要相當(dāng)長的時間來計(jì)算得湘。
看起來杖玲,模型驅(qū)動的本事很大,可以從圖像中分析出邊和節(jié)點(diǎn)的關(guān)系忽刽,形成測試路線, 疊加數(shù)據(jù)形成測試用例天揖;但是實(shí)操起來,該中方式依然存在兩個方面的問題:
1.? ? 測試人員不得不去先畫這個測試邏輯+數(shù)據(jù)的關(guān)系圖跪帝,而隨著頁面復(fù)雜度的提高今膊,最終這個圖表也會面臨維護(hù)難度大的問題
2.? ? 畫圖耗費(fèi)了大量的前期人力,而且測試本身沒有測重伞剑,沒有優(yōu)先級斑唬,沒有重點(diǎn),不利于策略模式下的定制化測試;最終的結(jié)果是一種策略恕刘,一副邏輯圖缤谎,重復(fù)造了輪子。
監(jiān)督學(xué)習(xí)下的圖像識別分析方法
為什么使用監(jiān)督學(xué)習(xí)褐着?因?yàn)闄C(jī)器學(xué)習(xí)的能力尚不穩(wěn)定坷澡,沒有結(jié)合已知知識體系自我思考的過程,在學(xué)習(xí)過程中時常會引入不必要的錯誤數(shù)據(jù)(系統(tǒng)誤差數(shù)據(jù))含蓉,因此必須清晰劃定界限給予明確分類標(biāo)準(zhǔn)以減少系統(tǒng)誤差频敛。
使用圖像識別的考慮是在不完全依賴于網(wǎng)站源碼的基礎(chǔ)上,能結(jié)合人工智能馅扣,在N個網(wǎng)頁中學(xué)習(xí)出一套模糊的知識體系斟赚,能用于第N+1個未知網(wǎng)頁的模糊匹配,得出一個概率隊(duì)列差油,根據(jù)設(shè)置的權(quán)重參數(shù)拗军,最后能得出準(zhǔn)確的結(jié)論;由于不同公司的前端開發(fā)風(fēng)格不同蓄喇,因此無法從源碼上直接下手发侵。
該方法面臨的挑戰(zhàn):
1.? ? 思考如何獲取到動作邏輯
2.? ? 動作數(shù)據(jù)從何而來
3.? ? 若以VUE為前端框架寫的站點(diǎn),源碼如何獲裙薄器紧?(思考:FirePath的侵入方式)
先寫到這里,等后面徹底解決上述問題之后再來豐富楼眷,目前暫時只能突破到這里了2簟(歡迎探討)
時隔1周罐柳,在之前遺留問題的基礎(chǔ)上重點(diǎn)解決【動作邏輯】和【操作數(shù)據(jù)】問題掌腰,如今有了新的突破,先來看測試實(shí)時日志:
通過“數(shù)據(jù)字典”和“行為軌跡”的建立齿梁,能夠1.創(chuàng)建出指導(dǎo)機(jī)器行為的一系列“動作”(當(dāng)然,包括先后順序關(guān)系)2.綁定“數(shù)據(jù)”到動作上(例如:一個【輸入】動作肮蛹,攜帶一個【參數(shù)】)
上述問題解決后勺择,系統(tǒng)全覆蓋模擬生成一系列的【測試用例】,交由“回放系統(tǒng)”進(jìn)行回放伦忠,實(shí)時記錄操作日志省核;注意:全程不用人寫測試用例,也不用畫邏輯圖昆码,機(jī)器只負(fù)責(zé)學(xué)習(xí)然后測試气忠。大家可能會問個問題邻储,機(jī)器究竟學(xué)了什么?可以告訴大家旧噪,兩個方面:
1.? ? 學(xué)習(xí)頁面吨娜,機(jī)器自己熟悉新頁面的構(gòu)造(圖像識別)
2.? ? 學(xué)習(xí)過去的自動化用例(大數(shù)據(jù)分析),這里有些許壁壘淘钟,如果沒有特定的用例中間層宦赠,這個大數(shù)據(jù)分析可能得不到想要的東西。至于什么是“特定的用例中間層”米母,請大家翻看我之前的文章【W(wǎng)eb端自動化】所介紹的錄制工具袱瓮;“中間層”由這款錄制工具得來。
接下來做什么爱咬?
準(zhǔn)備使用樸素貝葉斯機(jī)器學(xué)習(xí)對生成的這些用例逐個求一個準(zhǔn)確率,最終衡量一下這套理論的可行性绊起!謝謝大家閱讀精拟,歡迎討論!