成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

有贊 WEB-UI 自動(dòng)化實(shí)踐

h9911 / 1835人閱讀

摘要:概述是由有贊開(kāi)發(fā)的自動(dòng)化工具,并以此實(shí)現(xiàn)了端和端的核心業(yè)務(wù)的自動(dòng)化。旨在簡(jiǎn)化開(kāi)源工具提供的接口,方便自動(dòng)化測(cè)試用例的設(shè)計(jì)。元素定位自動(dòng)化用例其實(shí)可以分成兩部分,定位元素調(diào)用接口操作該元素。一臺(tái)用于跑自動(dòng)化用例的服務(wù)器。

概述

Bee 是由有贊 QA 開(kāi)發(fā)的 UI 自動(dòng)化工具,并以此實(shí)現(xiàn)了 web 端和 wap 端的核心業(yè)務(wù)的自動(dòng)化。旨在簡(jiǎn)化開(kāi)源工具提供的接口,方便 UI 自動(dòng)化測(cè)試用例的設(shè)計(jì)。

Bee 整個(gè)框架是基于 selenium 和 selenide 設(shè)計(jì)的??蚣軐?duì) selenium 和 selenide 提供的接口進(jìn)行了二次封裝以滿足日常的用例設(shè)計(jì),二次封裝后的接口解決了一些元素加載,元素定位解析等問(wèn)題,可以讓用例設(shè)計(jì)變得更加簡(jiǎn)便。
Bee 能支持 Web 和 Wap 頁(yè)面的元素定位以及操作,其中 Selenide 主要支持 Web 頁(yè)面的元素操作,Selenium 支持 Wap 頁(yè)面的元素操作。

Bee 為什么會(huì)采用 Selenide+Selenium 的模式。原因一,其實(shí)框架設(shè)計(jì)的初衷是想全部依賴 Selenide 來(lái)完成 Web 和 Wap 的自動(dòng)化,Selenide 對(duì)于作者來(lái)說(shuō)是一個(gè)全新的開(kāi)源框架,很想窺探一二; 原因二,Selenium 可無(wú)縫接入。在實(shí)踐過(guò)程中發(fā)現(xiàn) Selenide 還不能支持 Wap 頁(yè)面,滿足不了日常的測(cè)試需求,好在框架可以很容易的嵌入 Selenium 從而實(shí)現(xiàn)了 Wap 頁(yè)面的自動(dòng)化,也正是 Selenide 和 selenium 有這個(gè)特性,所以在框架設(shè)計(jì)初期才敢放心的嘗試采用Selenide;原因三,在實(shí)踐中的切身體會(huì) Selenide 對(duì)頁(yè)面元素的處理會(huì)比 Selenium 平滑的多,因?yàn)?Selenide 其本身也是對(duì) Selenium 的一個(gè)二次封裝,對(duì) Selenium 的接口也做了很多的優(yōu)化。

Bee 目前支持的環(huán)境為:mac、chrome,整個(gè)框架支持可擴(kuò)展。

對(duì)于 Selenide 和 Selenium 的原理不在本文中贅述,大家可以到網(wǎng)上學(xué)習(xí)了解。
Bee 開(kāi)源地址:beeyz,歡迎交流。

用例設(shè)計(jì)


按照實(shí)際的業(yè)務(wù)流程調(diào)用對(duì)應(yīng)接口來(lái)實(shí)現(xiàn) WEB-UI 自動(dòng)化測(cè)試用例。case 層可調(diào)用 service 層和 pageObject 層的接口,pageObject 是對(duì)每一個(gè)頁(yè)面元素的一個(gè)封裝,service 是對(duì)一個(gè)常用的業(yè)務(wù)模塊功能的封裝。比如一個(gè)營(yíng)銷(xiāo)秒殺的測(cè)試用例,需要依賴登入、創(chuàng)建商品,這兩個(gè)業(yè)務(wù)功能就可以直接調(diào)用 service 中的接口。秒殺活動(dòng)的創(chuàng)建就可以調(diào)用 pageObject 中的接口,然后按照秒殺的業(yè)務(wù)流程,在測(cè)試用例中把這些接口串起來(lái)就形成了一個(gè) UI 自動(dòng)化測(cè)試用例,詳細(xì)細(xì)節(jié)接下去會(huì)舉例說(shuō)明。

設(shè)計(jì)用例的靈活度取決于 pageObject 封裝的顆粒度,顆粒度越小越容易在用例層設(shè)計(jì)出新流程的測(cè)試用例。用例層使用了 testng,可按照實(shí)際的需求靈活設(shè)計(jì)一個(gè)測(cè)試用例。推薦在封裝 pageObject 接口的時(shí)候,顆粒度定義的越小越好,方便用例的擴(kuò)展和維護(hù)。pageObject 封裝的接口就相當(dāng)于一個(gè)原子,原子粒度越小越方便組裝成新的用例。相反如果粒度太粗維護(hù)上會(huì)不太方便。參考代碼:

截圖是一個(gè)秒殺用例。創(chuàng)建活動(dòng)之前,需要登入有贊微商城后臺(tái),登入操作已封裝到 loginService,直接調(diào)用 service 層的接口,不需要在意這個(gè)步驟的細(xì)節(jié);登入之后要指定一個(gè)商品參與秒殺活動(dòng),普通商品創(chuàng)建已封裝到 goodsService,直接調(diào)用 service 層的接口,不需要在意這個(gè)步驟的細(xì)節(jié);接著是創(chuàng)建秒殺活動(dòng),創(chuàng)建秒殺活動(dòng)的所有業(yè)務(wù)步驟都封裝到 seckillPage,這就是個(gè) pageObject 的實(shí)現(xiàn),也是用例設(shè)計(jì)中最主要的環(huán)節(jié)。最后把這幾個(gè)步驟串起來(lái)就形成了一個(gè)秒殺活動(dòng)的測(cè)試用例。用例結(jié)構(gòu)清晰,組裝簡(jiǎn)單。

框架介紹 1、工程結(jié)構(gòu)

整個(gè)工程基于 selenide & selenium,采用 pageObject 模式搭建起來(lái)。技術(shù)結(jié)構(gòu):selenide+selenium+testng+reportng+spring。下面對(duì)工程中的幾個(gè)重要模塊做介紹。

1.1 dataprovider — 數(shù)據(jù)層

為了實(shí)現(xiàn)測(cè)試數(shù)據(jù)和測(cè)試用例分離而采取的一種方法,數(shù)據(jù)模型在 model 中定義,具體的測(cè)試數(shù)據(jù)則在 dataprovider 中初始化。

1.2 driver — 接口層

對(duì) web 頁(yè)面所有元素的操作都是在這里定義接口并實(shí)現(xiàn)的。driver 對(duì) selenide&selenium 提供的接口做了二次封裝,對(duì)外提供封裝后的接口。common 實(shí)現(xiàn)了一些和接口相關(guān)的公共方法,比如模擬鍵盤(pán)按鈕等,目前 common 封裝的方法不多,大多功能都可以通過(guò) selenide&selenium 實(shí)現(xiàn)。driver 層對(duì)開(kāi)源工具接口做了二次封裝,想要驅(qū)動(dòng)一個(gè)瀏覽器還有一個(gè)必不可少的工具 —— 瀏覽器驅(qū)動(dòng),這個(gè)驅(qū)動(dòng)放在 resources 里,驅(qū)動(dòng)的版本必須與被測(cè)瀏覽器版本相匹配。

1.3 listeners — 監(jiān)聽(tīng)器

為了提高框架本身的容錯(cuò)能力監(jiān)聽(tīng)一些事件。目前實(shí)現(xiàn)了:1. 監(jiān)聽(tīng)用例測(cè)試結(jié)果,可對(duì)不同的測(cè)試結(jié)果監(jiān)聽(tīng)器做不同的處理;2. 失敗測(cè)試用例重試的監(jiān)聽(tīng),一個(gè) fail 的用例最多可重試3次。

1.4 model — 數(shù)據(jù)模型

為了實(shí)現(xiàn)測(cè)試數(shù)據(jù)和測(cè)試用例分離而采取的一種方法,具體的測(cè)試數(shù)據(jù)在 dataprovider 中初始化??梢詫?duì)一個(gè)業(yè)務(wù)流程中需要測(cè)試數(shù)據(jù)的元素在一個(gè) model 中定義出來(lái),方便管理和代碼閱讀。

1.5 pageObject — 業(yè)務(wù)層

pageObject 模式,接口形式封裝每一個(gè)頁(yè)面需要用到的元素,實(shí)現(xiàn)上只要做兩步:確定元素的定位方式;調(diào)用 driver 中對(duì)應(yīng)的操作接口。driver 的接口實(shí)現(xiàn)包含了一定的容錯(cuò)能力,但并不是全面的,有些頁(yè)面獨(dú)特性或者組件的獨(dú)特性單純調(diào)用 driver 的接口并不能保證測(cè)試用例的穩(wěn)定性,此時(shí)就需要在 pageObject 的接口實(shí)現(xiàn)中加入一些容錯(cuò)算法,確保用例穩(wěn)定性。
實(shí)際操作的經(jīng)驗(yàn)是 pageObject 對(duì)元素封裝的顆粒度越小,在用例設(shè)計(jì)層設(shè)計(jì)測(cè)試用例就越靈活,可以像組裝工具那樣組裝出一個(gè)新的測(cè)試用例。參考代碼:

1.6 service — 提供業(yè)務(wù)功能

一個(gè)業(yè)務(wù)流程很多時(shí)候依賴其他業(yè)務(wù)模塊功能,為了方便設(shè)計(jì)一個(gè)測(cè)試用例,也為了避免重復(fù)造輪子,service 層就提供了一些常用的業(yè)務(wù)功能,比如登入、創(chuàng)建商品等。依賴方只需要在 service 層調(diào)用即可。

2、功能優(yōu)化

Bee 對(duì) selenide&selenium 做二次封裝的同時(shí)也對(duì)接口做了些優(yōu)化,框架的初衷是使設(shè)計(jì)一個(gè) UI 用例盡可能的易設(shè)計(jì)、易讀、易維護(hù)。

2.1 接口優(yōu)化

直接調(diào)用 selenide 或者 selenium 的接口經(jīng)常會(huì)遇到些令人頭疼的問(wèn)題,比如網(wǎng)絡(luò)問(wèn)題使頁(yè)面 loading 太慢,需要操作的元素還沒(méi)展示出來(lái),這種情況就會(huì)經(jīng)常報(bào)元素找不到的 error,用例執(zhí)行失敗,但實(shí)際上這種報(bào)錯(cuò)不是一個(gè) bug,測(cè)試結(jié)果是無(wú)效的。為了提高誤報(bào)率 driver 層接口實(shí)現(xiàn)了等待元素加載的功能,使用的關(guān)鍵接口:Selenide.$(elementLocator).waitUntil(Condition.appears, timeout)。參考代碼:

`/**
     * 檢查元素加載情況
     * @param elementLocator
     * @param timeout
     * @return
     */
    private boolean checkElementLoad(By elementLocator, long timeout){
        try {
            Selenide.$(elementLocator).waitUntil(Condition.appears, timeout);
            return true;
        }catch (Exception ex){
            throw new RuntimeException(ex);
        }
    }
/**
     * 如果沒(méi)有找到元素拋null異常
     * @param element
     * @param timeout
     * @param elementType
     * @return
     */
    private By isElementLoaded(String element, long timeout,String ...elementType){
        By elementLocator = null;
        int count = 4;
        long partTimeout = timeout/count;
        for(int i=0; i

概述中提到過(guò) selenide 本身就是對(duì) selenium 的一個(gè)二次封裝,所以 selenide 對(duì)元素的操作會(huì)比 selenium 平滑的多。在頁(yè)面加載方面 selenide 本身有做優(yōu)化,再在 click、input 等操作接口中加入 waitUntil 的判斷可最大限度的等待一個(gè)元素的加載從而提高測(cè)試用例的穩(wěn)定性。

2.2 元素定位統(tǒng)一入口

接觸過(guò) UI 自動(dòng)化用例設(shè)計(jì)的同學(xué)會(huì)比較清楚,想通過(guò) selenide&selenium 操作一個(gè)元素,其中必不可少的就是對(duì)元素定位的描述,通俗的講就是要通知接口在當(dāng)前頁(yè)面操作哪個(gè)位置上的元素。定位一個(gè)元素的方法很多,常用的有 id,name,css,xpath 等,對(duì)應(yīng)不同的定位方法 selenide&selenium 在處理上也給出了不同接口。這從維護(hù)角度上來(lái)考慮顯然不是最好的。最好的做法就是用例設(shè)計(jì)者只管元素定位和操作事件的調(diào)用,而事件實(shí)現(xiàn)上走了哪種渠道最好是無(wú)感知,無(wú)需維護(hù)的。對(duì)此框架封裝了一個(gè)方法供 driver 調(diào)用,主要功能就是解析描述元素的字符串自動(dòng)判斷是 id、css 還是 xpath。

2.3 失敗測(cè)試用例重試

網(wǎng)絡(luò)原因等不確定因素會(huì)導(dǎo)致測(cè)試用例失敗,這種外部因素導(dǎo)致的失敗一般都會(huì)認(rèn)為它是無(wú)效的,為了提高測(cè)試報(bào)告的可信度,增加了失敗用例重試的機(jī)制。具體做法是實(shí)現(xiàn)一個(gè)用例測(cè)試結(jié)果的監(jiān)聽(tīng)器,當(dāng)監(jiān)聽(tīng)器監(jiān)聽(tīng)到一個(gè) fail 的結(jié)果,會(huì)觸發(fā)重試,失敗用例最多重試 3 次。

3、元素定位

UI自動(dòng)化用例其實(shí)可以分成兩部分,1. 定位元素;2. 調(diào)用接口操作該元素。其中定位一個(gè)元素的方法很多,常用的有 id,name,css,xpath。實(shí)際設(shè)計(jì)中選擇哪種定位方法一般會(huì)在維護(hù)角度上考慮的會(huì)多一些,因?yàn)楝F(xiàn)在的服務(wù)器性能配置等都很優(yōu)秀,所以跑一個(gè)WEB-UI用例可以不用考慮性能問(wèn)題。從維護(hù)成本上考慮會(huì)優(yōu)先選擇 id、name,其次 css,最后用 xpath。

我們并不能保證每一個(gè) web 系統(tǒng)的所有元素都能給你提供一個(gè)唯一 id 或者唯一的 name,當(dāng)然如果能和前端開(kāi)發(fā)達(dá)成合作這就是一件很美好的事情了,一般情況下我們都需要面對(duì)沒(méi)有 id 和 name 這兩個(gè)屬性的情況。這時(shí)我們就可以使用 css 樣式,很多時(shí)候 css 樣式是能滿足我們的定位需求。當(dāng)然在這些都不提供給我們的情況下就只能選擇 xpath,使用 xpath 的優(yōu)點(diǎn) 1. 易獲取,主流瀏覽器只要打開(kāi)“查看”就可以通過(guò) copy 輕松獲取到;2. 頁(yè)面上的元素都可以用 xpath 來(lái)描述;缺點(diǎn),不穩(wěn)定,大量使用的話會(huì)給用例維護(hù)產(chǎn)生很大的負(fù)擔(dān)。
xpath 一般只要前端在頁(yè)面上做一下小調(diào)整用例就必須重新維護(hù),在不得不使用 xpath 的情況下為了減少今后的維護(hù)量可對(duì) xpath 做一些優(yōu)化,可以減少 xpath 的路徑長(zhǎng)度提高穩(wěn)定性。以下是實(shí)踐過(guò)程中最長(zhǎng)用到的幾種類型:

依靠自己的屬性文本定位,如 //input[@value=‘XXXXX’]

包含指示性字符,如 //input[contains(text(),’指示性字符’)]

巧妙使用 descendant,如 //*[@id=‘a(chǎn)pp-container"]/descendant::input

CI集成

用例設(shè)計(jì)完成之后就可以加入集成建設(shè),讓UI自動(dòng)化用例在集成環(huán)境中發(fā)揮作用。測(cè)試報(bào)告展示使用 reportng。jenkins 的插件可以很好的把 report 呈現(xiàn)出來(lái),所以 reportng + jenkins 是一個(gè)很不錯(cuò)的組合。

搭建的步驟:

搭建一個(gè) jenkins。

一臺(tái)用于跑 UI 自動(dòng)化用例的服務(wù)器。

將服務(wù)器配置成 jenkins 的一個(gè)節(jié)點(diǎn)。

jenkins 創(chuàng)建 job,job 中需要使用的插件包含 Git、Excute shell、Editable Email Notification、Publish HTML reports。其中 editable email notification,支持郵件提醒,是個(gè)很不錯(cuò)的插件。支持 html report 格式,附件功能。

常見(jiàn)報(bào)錯(cuò)

使用 Bee 過(guò)程中經(jīng)常會(huì)遇到些問(wèn)題,這里做下總結(jié)方便 debug。

某些頁(yè)面不滾動(dòng)。有時(shí)候一屏展示不了所有的元素。理論上 selenide 或者 selenium 在一個(gè)頁(yè)面中查找一個(gè)元素是可以自動(dòng)執(zhí)行滾屏,但有些時(shí)候滾屏?xí)?,此時(shí)就需要在測(cè)試用例中實(shí)現(xiàn)滾屏查找元素。

解決方法:void scrollToElement(String element,String …elementType)

有些輸入框不能被 input 接口正常操作。實(shí)踐過(guò)程中在日歷控件中遇到過(guò),元素定位什么的都對(duì),但就是不能正常被操作。

解決方法:void triggerInput(String element,String …elementType),該接口起到一個(gè)觸發(fā)的作用,實(shí)際操作中遇到類似的情況可以把它當(dāng)做一種嘗試。

按鈕不能被 click 接口正常操作。button 元素定位完全正確。且在“檢查”窗口中看到的也是 button 屬性。


解決方法:調(diào)用接口 void clickByText(String text)

發(fā)現(xiàn) selenide 或者 selenium 的某些接口不能 work 了,此時(shí)最大的可能就是瀏覽器升級(jí)了。

解決方法:升級(jí)瀏覽器驅(qū)動(dòng)

元素不可見(jiàn)。有一種元素能在頁(yè)面上正常展示但對(duì)于工具來(lái)說(shuō)它是不可見(jiàn)的,這是因?yàn)樵谝话闱闆r下元素可見(jiàn)需要滿足以下幾個(gè)條件:visibility!=hidden ; display!=none; opacity!=0; height、width都大于0;對(duì)于 input 標(biāo)簽,沒(méi)有 hidden 屬性。如截圖就是 opacity=0 的實(shí)例。

解決方法:調(diào)用接口 void clickByJs(String element,String ... elementType)

結(jié)束語(yǔ)

Bee 是在開(kāi)源工具的基礎(chǔ)上做了些優(yōu)化,目前為止 Bee 更多的是在 driver 層做了些努力,數(shù)據(jù)層、業(yè)務(wù)層以及用例層的解決方案還有很大的提升空間。實(shí)現(xiàn)一個(gè) WEB-UI 自動(dòng)化用例主流的方法有錄制和代碼實(shí)現(xiàn)這兩種,其實(shí)兩種方法各有優(yōu)劣。

Bee 還不完美,后期還需繼續(xù)努力。感謝一直以來(lái)支持 Bee 開(kāi)發(fā)的小伙伴,有你有贊,有你有 Bee。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/8812.html

相關(guān)文章

  • SparkSQL 在有贊實(shí)踐

    摘要:在有贊的技術(shù)演進(jìn)。業(yè)務(wù)數(shù)據(jù)量正在不斷增大,這些任務(wù)會(huì)影響業(yè)務(wù)對(duì)外服務(wù)的承諾。監(jiān)控需要收集上執(zhí)行的的審計(jì)信息,包括提交者執(zhí)行的具體,開(kāi)始結(jié)束時(shí)間,執(zhí)行完成狀態(tài)。還有一點(diǎn)是詳細(xì)介紹了的原理,實(shí)踐中設(shè)置了的比默認(rèn)的減少了以上的時(shí)間。 前言 有贊數(shù)據(jù)平臺(tái)從2017年上半年開(kāi)始,逐步使用 SparkSQL 替代 Hive 執(zhí)行離線任務(wù),目前 SparkSQL 每天的運(yùn)行作業(yè)數(shù)量5000個(gè),占離線...

    hzx 評(píng)論0 收藏0
  • SparkSQL 在有贊實(shí)踐

    摘要:在有贊的技術(shù)演進(jìn)。業(yè)務(wù)數(shù)據(jù)量正在不斷增大,這些任務(wù)會(huì)影響業(yè)務(wù)對(duì)外服務(wù)的承諾。監(jiān)控需要收集上執(zhí)行的的審計(jì)信息,包括提交者執(zhí)行的具體,開(kāi)始結(jié)束時(shí)間,執(zhí)行完成狀態(tài)。還有一點(diǎn)是詳細(xì)介紹了的原理,實(shí)踐中設(shè)置了的比默認(rèn)的減少了以上的時(shí)間。 前言 有贊數(shù)據(jù)平臺(tái)從2017年上半年開(kāi)始,逐步使用 SparkSQL 替代 Hive 執(zhí)行離線任務(wù),目前 SparkSQL 每天的運(yùn)行作業(yè)數(shù)量5000個(gè),占離線...

    Xufc 評(píng)論0 收藏0
  • 有贊移動(dòng) iOS 組件化(模塊化)架構(gòu)設(shè)計(jì)實(shí)踐

    摘要:一背景業(yè)務(wù)組件化或者叫模塊化作為移動(dòng)端應(yīng)用架構(gòu)的主流方式之一,近年來(lái)一直是業(yè)界積極探索和實(shí)踐的方向。有贊移動(dòng)團(tuán)隊(duì)自年起也在不斷嘗試各種組件化方案,在有贊微商城,有贊零售,有贊美業(yè)等多個(gè)應(yīng)用中進(jìn)行了實(shí)踐。相比組件,個(gè)人感覺(jué)稱之為模塊更為合適。 一、背景 業(yè)務(wù)組件化(或者叫模塊化)作為移動(dòng)端應(yīng)用架構(gòu)的主流方式之一,近年來(lái)一直是業(yè)界積極探索和實(shí)踐的方向。有贊移動(dòng)團(tuán)隊(duì)自16年起也在不斷嘗試各種...

    Thanatos 評(píng)論0 收藏0
  • 有贊容器化實(shí)踐

    摘要:有贊容器化方案我們的容器化方案基于和,下面介紹一下我們?cè)诟鱾€(gè)方面遇到的問(wèn)題以及解決方案。不過(guò)對(duì)于上線來(lái)說(shuō),需要整個(gè)運(yùn)維體系來(lái)適配容器化,比如監(jiān)控發(fā)布日志等等。 前言 容器化已經(jīng)成為一種趨勢(shì),它可以解決很多運(yùn)維中的痛點(diǎn),比如效率、成本、穩(wěn)定性等問(wèn)題,而接入容器的過(guò)程中往往也會(huì)碰到很多問(wèn)題和不便。在有贊最開(kāi)始做容器化是為了快速交付開(kāi)發(fā)測(cè)試環(huán)境,在容器化的過(guò)程中,我們碰到過(guò)容器技術(shù)、運(yùn)維體系...

    songze 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<