成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

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

h9911 / 1892人閱讀

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

概述

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

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

Bee 為什么會(huì)采用 Selenide+Selenium 的模式。原因一,其實(shí)框架設(shè)計(jì)的初衷是想全部依賴 Selenide 來完成 Web 和 Wap 的自動(dòng)化,Selenide 對(duì)于作者來說是一個(gè)全新的開源框架,很想窺探一二; 原因二,Selenium 可無縫接入。在實(shí)踐過程中發(fā)現(xiàn) Selenide 還不能支持 Wap 頁面,滿足不了日常的測試需求,好在框架可以很容易的嵌入 Selenium 從而實(shí)現(xiàn)了 Wap 頁面的自動(dòng)化,也正是 Selenide 和 selenium 有這個(gè)特性,所以在框架設(shè)計(jì)初期才敢放心的嘗試采用Selenide;原因三,在實(shí)踐中的切身體會(huì) Selenide 對(duì)頁面元素的處理會(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 開源地址:beeyz,歡迎交流。

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


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

設(shè)計(jì)用例的靈活度取決于 pageObject 封裝的顆粒度,顆粒度越小越容易在用例層設(shè)計(jì)出新流程的測試用例。用例層使用了 testng,可按照實(shí)際的需求靈活設(shè)計(jì)一個(gè)測試用例。推薦在封裝 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è)步驟串起來就形成了一個(gè)秒殺活動(dòng)的測試用例。用例結(jié)構(gòu)清晰,組裝簡單。

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

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

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

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

1.2 driver — 接口層

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

1.3 listeners — 監(jiān)聽器

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

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

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

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

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

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

一個(gè)業(yè)務(wù)流程很多時(shí)候依賴其他業(yè)務(wù)模塊功能,為了方便設(shè)計(jì)一個(gè)測試用例,也為了避免重復(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ǎng)絡(luò)問題使頁面 loading 太慢,需要操作的元素還沒展示出來,這種情況就會(huì)經(jīng)常報(bào)元素找不到的 error,用例執(zhí)行失敗,但實(shí)際上這種報(bào)錯(cuò)不是一個(gè) bug,測試結(jié)果是無效的。為了提高誤報(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);
        }
    }
/**
     * 如果沒有找到元素拋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

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

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

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

2.3 失敗測試用例重試

網(wǎng)絡(luò)原因等不確定因素會(huì)導(dǎo)致測試用例失敗,這種外部因素導(dǎo)致的失敗一般都會(huì)認(rèn)為它是無效的,為了提高測試報(bào)告的可信度,增加了失敗用例重試的機(jī)制。具體做法是實(shí)現(xiàn)一個(gè)用例測試結(jié)果的監(jiān)聽器,當(dāng)監(jiān)聽器監(jiān)聽到一個(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用例可以不用考慮性能問題。從維護(hù)成本上考慮會(huì)優(yōu)先選擇 id、name,其次 css,最后用 xpath。

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

依靠自己的屬性文本定位,如 //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ā)揮作用。測試報(bào)告展示使用 reportng。jenkins 的插件可以很好的把 report 呈現(xiàn)出來,所以 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 格式,附件功能。

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

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

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

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

有些輸入框不能被 input 接口正常操作。實(shí)踐過程中在日歷控件中遇到過,元素定位什么的都對(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)

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

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

結(jié)束語

Bee 是在開源工具的基礎(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ù)努力。感謝一直以來支持 Bee 開發(fā)的小伙伴,有你有贊,有你有 Bee。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/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í)行的具體,開始結(jié)束時(shí)間,執(zhí)行完成狀態(tài)。還有一點(diǎn)是詳細(xì)介紹了的原理,實(shí)踐中設(shè)置了的比默認(rèn)的減少了以上的時(shí)間。 前言 有贊數(shù)據(jù)平臺(tái)從2017年上半年開始,逐步使用 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í)行的具體,開始結(jié)束時(shí)間,執(zhí)行完成狀態(tài)。還有一點(diǎn)是詳細(xì)介紹了的原理,實(shí)踐中設(shè)置了的比默認(rèn)的減少了以上的時(shí)間。 前言 有贊數(shù)據(jù)平臺(tái)從2017年上半年開始,逐步使用 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)的主流方式之一,近年來一直是業(yè)界積極探索和實(shí)踐的方向。有贊移動(dòng)團(tuán)隊(duì)自年起也在不斷嘗試各種組件化方案,在有贊微商城,有贊零售,有贊美業(yè)等多個(gè)應(yīng)用中進(jìn)行了實(shí)踐。相比組件,個(gè)人感覺稱之為模塊更為合適。 一、背景 業(yè)務(wù)組件化(或者叫模塊化)作為移動(dòng)端應(yīng)用架構(gòu)的主流方式之一,近年來一直是業(yè)界積極探索和實(shí)踐的方向。有贊移動(dòng)團(tuán)隊(duì)自16年起也在不斷嘗試各種...

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

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

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

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

0條評(píng)論

閱讀需要支付1元查看
<