【自動化測試】AOP模式在自動化測試中提高穩(wěn)定性的應(yīng)用

“哎吆,怎么這么多執(zhí)行失敗呢鹊汛?”,當(dāng)你看到自動化測試報告中低滩,尤其是ui自動化測試報告中顽冶,大面積執(zhí)行失敗欺抗,并且最后顯示的原因均是頁面元素timeout exception的時候,是不是覺得一個腦袋兩個大强重,雖然我們已經(jīng)加了等待時間绞呈,無論是隱式等待還是顯示等待,也不能完全解決該類問題间景!那有沒有啥好的方法來解決這個問題报强,以便提高自動化測試的穩(wěn)定性呢?

哈哈拱燃,答案是肯定的秉溉,那就是我們今天的主題,自動重試實(shí)現(xiàn)方法--AOP模式碗誉。相信有些老鐵會問了:什么是aop召嘶,我們當(dāng)如何去自動重試呢?AOP為Aspect Oriented Programming的縮寫,是面向切面編程,通過預(yù)編譯方式和運(yùn)行其動態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)哮缺。今天我們以百度搜索首頁為例弄跌,來詳細(xì)給大家分享-aop模式的應(yīng)用。

? ? ? 接著簡單給大家介紹一下自動化case的場景:進(jìn)入百度首頁尝苇,在搜索框內(nèi)輸入要搜索的關(guān)鍵字铛只,并點(diǎn)擊搜索按鈕。這里包含了百度首頁頁面的兩個元素糠溜,搜索輸入框和搜索按鈕淳玩。假設(shè)搜索輸入框元素一直加載不出來,我們要對整個輸入關(guān)鍵字的動作進(jìn)行重試非竿。而整個輸入關(guān)鍵字的動作是一個方法蜕着,如下:

public void sendKeysForSearchInput(String content){

searchInput.waitForPresent();

searchInput.clear();

searchInput.sendKeys(content);

}

那么如何來通過aop來實(shí)現(xiàn)我們的重試目標(biāo)呢?步驟如下:

首先红柱,要創(chuàng)建一個模板RetryTemplate類文件承匣,將要重試的次數(shù)蓖乘、重試的間隔時間和什么條件下重試定義于該模板中,以便后面的aop切面類中調(diào)用韧骗,具體的實(shí)現(xiàn)代碼如下嘉抒。

public abstract class RetryTemplate {

private static final int DEFAULT_RETRY_COUNT =0;

private int retryCount =DEFAULT_RETRY_COUNT;

// reset sleep time

private int sleepTime =0;

public int getSleepTime() {

return sleepTime;

}

public RetryTemplate setSleepTime(int sleepTime) {

if(sleepTime <0) {

throw new IllegalArgumentException("sleepTime shall be equal or bigger than 0");

}

this.sleepTime = sleepTime;

return this;

}

public int getRetryCount() {

return retryCount;

}

public RetryTemplate setRetryCount(int retryCount) {

if (retryCount <=0) {

throw new IllegalArgumentException("retryCount shall bigger than 0");

}

this.retryCount = retryCount;

return this;

}

/**

* retry for business,throw exception when fail;

* whether retry or not by returning status;

*

@return

*/

protected abstract Object toDo()throws Throwable;

public Object execute()throws InterruptedException {

for (int i =0; i <=retryCount; i++) {

try {

return toDo();

}catch (Throwable? e) {

System.out.println("run business:? "+ (i+1) +" times");

System.out.println("run business exception,e: "+e);

Thread.sleep(sleepTime);

}

}

return null;

}

}

其次袍暴,創(chuàng)建一個注解RetryFunction, 以便我們在需要重試的method中使用众眨。

具體代碼如下,其中定義了count和sleep參數(shù)容诬,count傳入method需要重試的次數(shù)娩梨,sleep傳入兩次重試的間隔時間。

import java.lang.annotation.*;

@Documented

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

public @interface RetryFunction {

/**

* retryCount

? ? * @return

? ? */

? ? int count()default 0;

/**

* retry interval Time

? ? * @return

? ? */

? ? int sleep()default 0;

}

然后览徒,也是我們最核心的一步狈定,定義我們的aop,即新建RetryAspect類文件习蓬。實(shí)現(xiàn)代碼如下:

import lombok.extern.slf4j.Slf4j;

import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.Around;

import org.aspectj.lang.annotation.Aspect;

import org.springframework.stereotype.Component;

@Aspect

@Component

@Slf4j

public class RetryAspect {

@Around(value ="@annotation(retryFunction)")

public Object execute(ProceedingJoinPoint joinPoint,RetryFunction retryFunction)throws Exception {

RetryTemplate retryTemplate =new RetryTemplate() {

@Override

? ? ? ? ? ? protected Object toDo()throws Throwable {

return joinPoint.proceed();

}

};

retryTemplate.setRetryCount(retryFunction.count()).setSleepTime(retryFunction.sleep());

return retryTemplate.execute();

}

}

是不是這樣就算結(jié)束了纽什,可以正常使用了呢,那肯定還是不行的躲叼,我們還需要配置aop.xml文件(base-package要配置正確芦缰,否則不能生效):

<?xml version="1.0" endcoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

? ? ? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

? ? ? xmlns:context="http://www.springframework.org/schema/context"

? ? ? xmlns:aop="http://www.springframework.org/schema/aop"

? ? ? xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

<context:component-scan base-package="src.test.java"/>

<context:annotation-config/>

<aop:aspectj-autoproxy/>

</beans>

前面三步完成后,最后我們需要引用一下RetryFuction注解枫慷,看看實(shí)際的效果呢让蕾!回到文章開頭,介紹百度搜索首頁的輸入方法sendKeysForSearchInput或听。只需要在該方法上加上注解RetryFunction并配置想要重試的次數(shù)和時間即可探孝,如下:

@RetryFunction(count =1,sleep =2)

public void sendKeysForSearchInput(String content){

searchInput.waitForPresent();

searchInput.clear();

searchInput.sendKeys(content);

}

運(yùn)行的結(jié)果實(shí)際結(jié)果,如下圖所示誉裆,成功實(shí)現(xiàn)了sendKeysForSearchInput的重試顿颅。

最后,我們用實(shí)踐見識了aop的魅力足丢,為實(shí)現(xiàn)方法級別的重試粱腻,確實(shí)是不錯的解決方法。避免了強(qiáng)入侵業(yè)務(wù)代碼斩跌,方便方法自動重試绍些。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市滔驶,隨后出現(xiàn)的幾起案子遇革,更是在濱河造成了極大的恐慌卿闹,老刑警劉巖揭糕,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萝快,死亡現(xiàn)場離奇詭異,居然都是意外死亡著角,警方通過查閱死者的電腦和手機(jī)揪漩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吏口,“玉大人奄容,你說我怎么就攤上這事〔玻” “怎么了昂勒?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長舟铜。 經(jīng)常有香客問我戈盈,道長,這世上最難降的妖魔是什么谆刨? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任塘娶,我火速辦了婚禮,結(jié)果婚禮上痊夭,老公的妹妹穿的比我還像新娘刁岸。我一直安慰自己,他們只是感情好她我,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布虹曙。 她就那樣靜靜地躺著,像睡著了一般番舆。 火紅的嫁衣襯著肌膚如雪根吁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天合蔽,我揣著相機(jī)與錄音击敌,去河邊找鬼。 笑死拴事,一個胖子當(dāng)著我的面吹牛沃斤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播刃宵,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼衡瓶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了牲证?” 一聲冷哼從身側(cè)響起哮针,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后十厢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體等太,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年蛮放,在試婚紗的時候發(fā)現(xiàn)自己被綠了缩抡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡包颁,死狀恐怖瞻想,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情娩嚼,我是刑警寧澤蘑险,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站岳悟,受9級特大地震影響漠其,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜竿音,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一和屎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧春瞬,春花似錦柴信、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至萄涯,卻和暖如春绪氛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背涝影。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工枣察, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人燃逻。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓序目,卻偏偏與公主長得像,于是被迫代替她去往敵國和親伯襟。 傳聞我的和親對象是個殘疾皇子猿涨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)姆怪,斷路器叛赚,智...
    卡卡羅2017閱讀 134,672評論 18 139
  • 目錄 1. Web MVC發(fā)展史歷程2.Spring概要3.Spring-依賴注入概要(IOC)4.屬性注入的三種...
    唯老閱讀 1,451評論 0 3
  • 一澡绩、概要 Spring加入了對AOP編程支持,利用AOP的思想結(jié)合Spring的一些API可以實(shí)現(xiàn)核心業(yè)務(wù)與輔助業(yè)...
    任未然閱讀 242評論 0 1
  • 主要內(nèi)容 Spring 整合 JDBC 環(huán)境 Spring 框架除了提供 IOC 與 AOP 核心功能外俺附,同樣提供...
    冰島暖男的春天閱讀 286評論 0 0
  • 六昙读、基于@Aspect注解編程(重點(diǎn)) 1召调、說明 Spring 使用了和AspectJ 一樣的注解并使用Aspec...
    唯老閱讀 567評論 0 1