GUI 自動(dòng)化測(cè)試穩(wěn)定性,最典型的表現(xiàn)形式就是挂谍,同樣的測(cè)試用例在同樣的環(huán)境上叔壤,時(shí)而測(cè)試通過(guò),時(shí)而測(cè)試失敗口叙。
造成 GUI 測(cè)試不穩(wěn)定的因素
一炼绘、非預(yù)計(jì)的彈出對(duì)話(huà)框
1.1、GUI 自動(dòng)化測(cè)試用例執(zhí)行過(guò)程中妄田,操作系統(tǒng)彈出的非預(yù)計(jì)對(duì)話(huà)框
比如俺亮,GUI 測(cè)試運(yùn)行到一半仗哨,操作系統(tǒng)突然彈出殺毒軟件更新請(qǐng)求、病毒告警信息铅辞、系統(tǒng)更新請(qǐng)求等對(duì)話(huà)框厌漂。這種對(duì)話(huà)框的彈出往往是難以預(yù)計(jì)的,但是一旦發(fā)生就有可能造成 GUI 自動(dòng)化測(cè)試的不穩(wěn)定斟珊。
1.2苇倡、被測(cè)軟件本身也有可能在非預(yù)期的時(shí)間彈出預(yù)期的對(duì)話(huà)框
比如,被測(cè)軟件是一個(gè)電子商務(wù)網(wǎng)站囤踩,在網(wǎng)站上進(jìn)行操作時(shí)旨椒,很可能會(huì)隨機(jī)彈出“用戶(hù)調(diào)查”對(duì)話(huà)框。雖然這種對(duì)話(huà)框是可知的堵漱,但是具體會(huì)在哪一步彈出卻是不可預(yù)期的综慎。而這,往往會(huì)造成 GUI 自動(dòng)化測(cè)試的不穩(wěn)定勤庐。
解決方案:
1示惊、當(dāng)自動(dòng)化腳本發(fā)現(xiàn)控件無(wú)法正常定位,或者無(wú)法操作時(shí)愉镰,GUI 自動(dòng)化框架自動(dòng)進(jìn)入“異常場(chǎng)景恢復(fù)模式”米罚。
2、在“異常場(chǎng)景恢復(fù)模式”下丈探,GUI 自動(dòng)化框架依次檢查各種可能出現(xiàn)的對(duì)話(huà)框录择,一旦確認(rèn)了對(duì)話(huà)框的類(lèi)型,立即執(zhí)行預(yù)定義的操作(比如碗降,單擊“確定”按鈕隘竭,關(guān)閉這個(gè)對(duì)話(huà)框),接著重試剛才失敗的步驟讼渊。
注:這種方式只能處理已知可能出現(xiàn)的對(duì)話(huà)框动看。
而對(duì)于新類(lèi)型的對(duì)話(huà)框,只能通過(guò)自動(dòng)化的方式嘗試點(diǎn)擊上面的按鈕進(jìn)行處理精偿。每當(dāng)發(fā)現(xiàn)一種潛在會(huì)彈出的對(duì)話(huà)框弧圆,我們就把它的詳細(xì)信息(包括對(duì)象定位信息等)更新到“異常場(chǎng)景恢復(fù)”庫(kù)中赋兵,下次再遇到相同類(lèi)型的對(duì)話(huà)框時(shí)笔咽,系統(tǒng)就可以自動(dòng)關(guān)閉了。
對(duì)于非預(yù)期的彈框也可以通過(guò)檢查置頂窗口是否是預(yù)期軟件窗口霹期,從而確定是否被第三方彈框影響
二叶组、頁(yè)面控件屬性的細(xì)微變化
比如,“登錄”按鈕的 ID 從“Button_Login_001”變成了“Button_Login_888”历造,那么如果 GUI 自動(dòng)化測(cè)試腳本還是按照原來(lái)的“Button_Login_001”來(lái)定位“登錄”按鈕甩十,就會(huì)因?yàn)?ID 值的變化船庇,定位不到它了,自動(dòng)化測(cè)試用例自然就會(huì)失敗侣监。
解決方案:
1鸭轮、通過(guò)控件類(lèi)型(Button)縮小了范圍
2、通過(guò)屬性值中的關(guān)鍵字(Login)進(jìn)一步縮小范圍
3橄霉、根據(jù)屬性值變化前后的相似性窃爷,最終定位到該控件
采用“組合屬性”定位控件會(huì)更精準(zhǔn),而且成功率會(huì)更高姓蜂,如果能在此基礎(chǔ)上加入“模糊匹配”技術(shù)按厘,可以進(jìn)一步提高控件的識(shí)別率。
“模糊匹配”是指钱慢,通過(guò)特定的相似度算法逮京,控件屬性發(fā)生細(xì)微變化時(shí),這個(gè)控件依舊可以被準(zhǔn)確定位束莫。
但是懒棉,開(kāi)源的 GUI 自動(dòng)化測(cè)試框架,目前還沒(méi)有現(xiàn)成的框架直接支持模糊匹配览绿,通常需要你進(jìn)行二次開(kāi)發(fā)漓藕,實(shí)現(xiàn)思路是:實(shí)現(xiàn)自己的對(duì)象識(shí)別控制層,也就是在原本的對(duì)象識(shí)別基礎(chǔ)上額外封裝一層挟裂,在這個(gè)額外封裝的層中加上模糊匹配的實(shí)現(xiàn)邏輯享钞。
如果是 selenium 的話(huà),建議優(yōu)先使用 xpath诀蓉,這樣就算 id栗竖、clases、name 等控件屬性改變渠啤,只要不是頁(yè)面改版狐肢,應(yīng)該不會(huì)影響自動(dòng)化穩(wěn)定性。
三沥曹、被測(cè)系統(tǒng)的 A/B 測(cè)試
A/B 測(cè)試份名,是互聯(lián)網(wǎng)產(chǎn)品常用的一種測(cè)試方法。它為 Web 或 App 的界面或流程提供兩個(gè)不同的版本妓美,然后讓用戶(hù)隨機(jī)訪(fǎng)問(wèn)其中一個(gè)版本僵腺,并收集兩個(gè)版本的用戶(hù)體驗(yàn)數(shù)據(jù)和業(yè)務(wù)數(shù)據(jù),最后分析評(píng)估出最好的版本用于正式發(fā)布壶栋。
A/B 測(cè)試通常會(huì)發(fā)布到實(shí)際生產(chǎn)環(huán)境辰如,所以就會(huì)造成生產(chǎn)環(huán)境中 GUI 自動(dòng)化測(cè)試的不穩(wěn)定。
解決思路:在測(cè)試腳本內(nèi)部對(duì)不同的被測(cè)版本做分支處理贵试,腳本需要能夠區(qū)分 A 和 B 兩個(gè)的不同版本琉兜,并做出相應(yīng)的處理凯正。
四、隨機(jī)頁(yè)面延遲造成控件識(shí)別失敗
加入重試(retry)機(jī)制豌蟋,當(dāng)某一步 GUI 操作失敗時(shí)廊散,框架會(huì)自動(dòng)發(fā)起重試,重試可以是步驟級(jí)別的梧疲,也可以是頁(yè)面級(jí)別的奸汇,甚至是業(yè)務(wù)流程級(jí)別的。
對(duì)于開(kāi)源 GUI 測(cè)試框架往声,重試機(jī)制往往不是自帶的功能擂找,需要自己二次開(kāi)發(fā)來(lái)實(shí)現(xiàn)。
注:對(duì)于那些會(huì)修改一次性使用數(shù)據(jù)的場(chǎng)景浩销,切忌不要盲目啟用頁(yè)面級(jí)別和業(yè)務(wù)流程級(jí)別的重試贯涎。
重試機(jī)制確實(shí)是個(gè)好辦法,但是如果用例都是因?yàn)橹卦嚥艌?zhí)行正確慢洋,有可能會(huì)漏出和緩存相關(guān)的問(wèn)題塘雳,因?yàn)橹卦噾?yīng)該算一個(gè)獨(dú)立測(cè)試場(chǎng)景了,現(xiàn)在是把它作為主要測(cè)試場(chǎng)景了普筹。
五败明、測(cè)試數(shù)據(jù)問(wèn)題
比如,測(cè)試用例所依賴(lài)的數(shù)據(jù)被其他用例修改了太防;再比如妻顶,測(cè)試過(guò)程中發(fā)生錯(cuò)誤后自動(dòng)進(jìn)行了重試操作,但是數(shù)據(jù)狀態(tài)已經(jīng)在第一次執(zhí)行中被修改了蜒车。
構(gòu)造自動(dòng)化數(shù)據(jù)時(shí)要特別注意讳嘱,構(gòu)造一些帶特殊字段的數(shù)據(jù)庫(kù)信息,最好是超出常人操作的數(shù)據(jù)信息酿愧,這樣可以有效避免數(shù)據(jù)被誤修改的風(fēng)險(xiǎn)沥潭,當(dāng)然,還有一個(gè)處理辦法就是先檢查測(cè)試數(shù)據(jù)是否存在/異常嬉挡,不存在或異常都進(jìn)行重建即可钝鸽,這部分也算是測(cè)試代碼的兼容處理吧。