【目標(biāo)】:讓機(jī)器像人一樣去測(cè)試未知的web頁(yè)面。(這里變換一下思路,其實(shí)是研究基于人工智能的用例生成系統(tǒng))
【涉及到的問(wèn)題】:驅(qū)動(dòng)機(jī)器去測(cè)試的一些列動(dòng)作邏輯從何而來(lái)?每個(gè)動(dòng)作所攜帶的數(shù)據(jù)入口在哪兒?
【涉及到的難點(diǎn)】:如何讓機(jī)器像人一樣去理解新頁(yè)面,如何讓機(jī)器使用動(dòng)作邏輯+數(shù)據(jù)對(duì)頁(yè)面進(jìn)行測(cè)試?斷言該怎么引入?
【探索的方向】:????1.? ? 基于前端埋點(diǎn)的數(shù)據(jù)大量收集整理???? 2. 模型驅(qū)動(dòng)方法? ? 3.監(jiān)督學(xué)習(xí)下的圖像識(shí)別分析方法 ...(如有不同見解請(qǐng)留下寶貴意見)
下面結(jié)合問(wèn)題、難點(diǎn)對(duì)探索方向做進(jìn)一步的分析:
埋點(diǎn)+大數(shù)據(jù)歸類分析
該方法的大前提是在線上環(huán)境的源碼中“插樁”,植入一段js,將用戶操作時(shí)的一系列動(dòng)作軌跡和結(jié)果信息保存下來(lái),回傳給數(shù)據(jù)庫(kù),這樣做最終問(wèn)題留給了數(shù)據(jù)分析,期望從一堆雜亂的數(shù)據(jù)中去抽取大概率的路徑覆蓋,這樣做的結(jié)果會(huì)有3方面問(wèn)題:
1.? ? 源碼插樁,開發(fā)會(huì)考慮性能問(wèn)題;屬于強(qiáng)行介入式的,簡(jiǎn)單粗暴;不易達(dá)成共識(shí);
2.? ? 用戶尚若發(fā)現(xiàn)自己的操作持續(xù)被窺探中,后果將不堪設(shè)想;信息外泄事情就更大了;因此這個(gè)方案看似簡(jiǎn)單,實(shí)則考慮甚廣;
3.? ? 一堆雜亂的使用數(shù)據(jù)沒有先后順序,諸如先干啥后干啥此類信息不明;全為并列關(guān)系;
4.? ? 最核心的問(wèn)題來(lái)了,即使是大量用戶使用也無(wú)法做到功能的全覆蓋,換句話說(shuō),用戶只是使用了自己認(rèn)為最常用的那些功能,而沒用到的功能或者沒有走過(guò)的路徑不敢保證其沒有問(wèn)題;漏測(cè)。
模型驅(qū)動(dòng)
模型的目的就是用來(lái)為構(gòu)造測(cè)試用例而進(jìn)行的被測(cè)系統(tǒng)描述。一個(gè)測(cè)試模型可以由箭頭和節(jié)點(diǎn)組成如下圖所示:

Start頂點(diǎn):? ? start頂點(diǎn)不是必需的。如果使用,則必須有1個(gè)(且只有1個(gè))頂點(diǎn)名稱為:start.
從start頂點(diǎn)出發(fā)只能有1個(gè)邊。start頂點(diǎn)不會(huì)包括在任何生成的測(cè)試路徑中,它只表示一個(gè)開始位。
頂點(diǎn)或邊的名字(name):? ? 名稱是第一個(gè)單詞,位于標(biāo)簽中邊或頂點(diǎn)的第一行。
標(biāo)簽(Lable):? ? 標(biāo)簽是點(diǎn)或邊上的所有文字描述。
守衛(wèi)(Guards)僅用于Edge:? ? 守衛(wèi)guard是一種只與邊相關(guān)的機(jī)制。他們的角色與if語(yǔ)句相同,并且使邊有資格或者沒有資格被訪問(wèn)。守衛(wèi)guard是一個(gè)用方括號(hào)括起來(lái)的JavaScript條件表達(dá)式只有一個(gè)。[loggedIn == true]上面意味著如果屬性loggedIn等于true,則邊是可訪問(wèn)的。
操作(Action)僅用于Edge:? ? 動(dòng)作是僅與邊相關(guān)聯(lián)的機(jī)制。這是我們要在模型中執(zhí)行的JavaScript代碼。它放在正斜杠之后。Action可以有多個(gè),每個(gè)語(yǔ)句必須以分號(hào)結(jié)尾。/loggedIn=false; rememberMe=true; action是動(dòng)作代碼,它的執(zhí)行結(jié)果將作為數(shù)據(jù)傳遞給守衛(wèi)。
路徑生成器:? ??生成器是決定如何遍歷模型的算法。不同的生成器將生成不同的測(cè)試序列,并且它們將以不同的方式遍歷模型。多個(gè)發(fā)生器可以串聯(lián)。
random( some stop condition(s) )
以完全隨機(jī)的方式瀏覽模型。也稱為“醉漢走路”或“隨機(jī)步行”。該算法通過(guò)隨機(jī)從頂點(diǎn)選擇出邊,并且在下一個(gè)頂點(diǎn)時(shí)重復(fù)此過(guò)程。
quick_random( some stop condition(s) )
嘗試運(yùn)行通過(guò)模型的最短路徑,但以快速的方式。這是算法的工作原理:
1.????選擇一個(gè)尚未被隨機(jī)訪問(wèn)的邊。
2.????使用Dijkstra算法選擇到該邊緣的最短路徑
3.????走該路徑,并將所有執(zhí)行的邊標(biāo)記為已訪問(wèn)。
4.????當(dāng)在步驟1中達(dá)到選定的邊緣時(shí),從頭開始,重復(fù)步驟1-> 4。
該算法對(duì)于非常大的模型工作良好,并且生成合理的短序列。缺點(diǎn)是當(dāng)與EFSM結(jié)合使用時(shí)。該算法可以選擇被守衛(wèi)block的路徑。
a_star( a stop condition that names a vertex or an edge )
將生成到特定頂點(diǎn)或邊的最短路徑。
shortest_all_paths ==> (Not released yet)
將計(jì)算并生成通過(guò)模型的最短路徑。每個(gè)邊緣的成本設(shè)置為1. 不建議使用此算法,因?yàn)閷?duì)于較大的模型,并且使用模型(EFSM)中的數(shù)據(jù),將需要相當(dāng)長(zhǎng)的時(shí)間來(lái)計(jì)算。
看起來(lái),模型驅(qū)動(dòng)的本事很大,可以從圖像中分析出邊和節(jié)點(diǎn)的關(guān)系,形成測(cè)試路線, 疊加數(shù)據(jù)形成測(cè)試用例;但是實(shí)操起來(lái),該中方式依然存在兩個(gè)方面的問(wèn)題:
1.? ? 測(cè)試人員不得不去先畫這個(gè)測(cè)試邏輯+數(shù)據(jù)的關(guān)系圖,而隨著頁(yè)面復(fù)雜度的提高,最終這個(gè)圖表也會(huì)面臨維護(hù)難度大的問(wèn)題
2.? ? 畫圖耗費(fèi)了大量的前期人力,而且測(cè)試本身沒有測(cè)重,沒有優(yōu)先級(jí),沒有重點(diǎn),不利于策略模式下的定制化測(cè)試;最終的結(jié)果是一種策略,一副邏輯圖,重復(fù)造了輪子。
監(jiān)督學(xué)習(xí)下的圖像識(shí)別分析方法
為什么使用監(jiān)督學(xué)習(xí)?因?yàn)闄C(jī)器學(xué)習(xí)的能力尚不穩(wěn)定,沒有結(jié)合已知知識(shí)體系自我思考的過(guò)程,在學(xué)習(xí)過(guò)程中時(shí)常會(huì)引入不必要的錯(cuò)誤數(shù)據(jù)(系統(tǒng)誤差數(shù)據(jù)),因此必須清晰劃定界限給予明確分類標(biāo)準(zhǔn)以減少系統(tǒng)誤差。
使用圖像識(shí)別的考慮是在不完全依賴于網(wǎng)站源碼的基礎(chǔ)上,能結(jié)合人工智能,在N個(gè)網(wǎng)頁(yè)中學(xué)習(xí)出一套模糊的知識(shí)體系,能用于第N+1個(gè)未知網(wǎng)頁(yè)的模糊匹配,得出一個(gè)概率隊(duì)列,根據(jù)設(shè)置的權(quán)重參數(shù),最后能得出準(zhǔn)確的結(jié)論;由于不同公司的前端開發(fā)風(fēng)格不同,因此無(wú)法從源碼上直接下手。
該方法面臨的挑戰(zhàn):
1.? ? 思考如何獲取到動(dòng)作邏輯
2.? ? 動(dòng)作數(shù)據(jù)從何而來(lái)
3.? ? 若以VUE為前端框架寫的站點(diǎn),源碼如何獲?。浚ㄋ伎迹篎irePath的侵入方式)
先寫到這里,等后面徹底解決上述問(wèn)題之后再來(lái)豐富,目前暫時(shí)只能突破到這里了?。g迎探討)




時(shí)隔1周,在之前遺留問(wèn)題的基礎(chǔ)上重點(diǎn)解決【動(dòng)作邏輯】和【操作數(shù)據(jù)】問(wèn)題,如今有了新的突破,先來(lái)看測(cè)試實(shí)時(shí)日志:


通過(guò)“數(shù)據(jù)字典”和“行為軌跡”的建立,能夠1.創(chuàng)建出指導(dǎo)機(jī)器行為的一系列“動(dòng)作”(當(dāng)然,包括先后順序關(guān)系)2.綁定“數(shù)據(jù)”到動(dòng)作上(例如:一個(gè)【輸入】動(dòng)作,攜帶一個(gè)【參數(shù)】)
上述問(wèn)題解決后,系統(tǒng)全覆蓋模擬生成一系列的【測(cè)試用例】,交由“回放系統(tǒng)”進(jìn)行回放,實(shí)時(shí)記錄操作日志;注意:全程不用人寫測(cè)試用例,也不用畫邏輯圖,機(jī)器只負(fù)責(zé)學(xué)習(xí)然后測(cè)試。大家可能會(huì)問(wèn)個(gè)問(wèn)題,機(jī)器究竟學(xué)了什么?可以告訴大家,兩個(gè)方面:
1.? ? 學(xué)習(xí)頁(yè)面,機(jī)器自己熟悉新頁(yè)面的構(gòu)造(圖像識(shí)別)
2.? ? 學(xué)習(xí)過(guò)去的自動(dòng)化用例(大數(shù)據(jù)分析),這里有些許壁壘,如果沒有特定的用例中間層,這個(gè)大數(shù)據(jù)分析可能得不到想要的東西。至于什么是“特定的用例中間層”,請(qǐng)大家翻看我之前的文章【W(wǎng)eb端自動(dòng)化】所介紹的錄制工具;“中間層”由這款錄制工具得來(lái)。
接下來(lái)做什么?
準(zhǔn)備使用樸素貝葉斯機(jī)器學(xué)習(xí)對(duì)生成的這些用例逐個(gè)求一個(gè)準(zhǔn)確率,最終衡量一下這套理論的可行性!謝謝大家閱讀,歡迎討論!
附錄:
