亚洲好骚综合-亚洲黄色录像-亚洲黄色网址-亚洲黄色网址大全-99久久99久久-99久久99久久精品国产

您的位置:軟件測試 > 開源軟件測試 > 開源單元測試工具 > TestNG
TestNG TestCase失敗重試
作者:網絡轉載 發布時間:[ 2017/4/14 11:19:36 ] 推薦標簽:單元測試工具 TestNG

  簡單介紹
  需求場景:測試移動端應用,常會因為點擊失效、網絡延遲大等原因導致測試腳本失敗。這時,需要自動重新運行失敗的腳本,直到腳本成功通過或者到達限定重試次數。
  解決方案:實現testng的IRetryAnalyzer接口
  IRetryAnalyzer
  IRetryAnalyzer是testng的一個接口,包含一個retry方法,用于實現失敗重試的功能。實現IRetryAnalyzer接口的代碼如下:
  retry方法的用法是:返回true表示testcase重新運行一次,反之,返回false。
  通過自己定義的兩個變量retryCount和maxRetryCount來分別記錄重試的次數和多重試的次數。
1 package main.java.com.dbyl.library.utils;
2
3 /**
4  * Created by wwh on 17/2/23.
5  */
6 import org.testng.IRetryAnalyzer;
7 import org.testng.ITestResult;
8
9 public class Retry implements IRetryAnalyzer {
10     private int retryCount = 0;
11     private int maxRetryCount = 5;
12
13     // Below method returns 'true' if the test method has to be retried else 'false'
14 //and it takes the 'Result' as parameter of the test method that just ran
15     public boolean retry(ITestResult result) {
16         if (retryCount < maxRetryCount) {
17             System.out.println("Retrying test " + result.getName() + " with status "
18                     + getResultStatusName(result.getStatus()) + " for the " + (retryCount+1) + " time(s).");
19             retryCount++;
20             return true;
21         }
22         return false;
23     }
24
25     public String getResultStatusName(int status) {//這個函數將狀態碼轉換為狀態文字。
26         String resultName = null;
27         if(status==1)
28             resultName = "SUCCESS";
29         if(status==2)
30             resultName = "FAILURE";
31         if(status==3)
32             resultName = "SKIP";
33         return resultName;
34     }
35 }
  使用方法
  有兩種方法使用上面定義的Retry.class:一種是注解,另一種是借助于testng.xml文件。
  方法一:通過注解失敗重試
  修改testcase的注解,由@Test改為@Test(retryAnalyzer = Retry.class)。表示這個testcase使用了失敗重試的執行策略。
package main.java.com.dbyl.library.utils;
import org.testng.Assert;
import org.testng.annotations.Test;
/**
* Created by wwh on 17/2/23.
*/
public class TestRetry {
@Test(retryAnalyzer = Retry.class)
public void Demo() {
Assert.fail();
}
@Test
public void Demo2(){
Assert.fail();
}
@Test
public void Demo3(){
}
}
  輸出結果為:共運行8個testcase,失敗了2個(demo和demo2失敗了),跳過5個(demo失敗后,重試了5次,都失敗了,標記為“跳過”),還剩一個成功的是demo3。
[TestNG] Running:
/Users/wwh/Library/Caches/IdeaIC2016.3/temp-testng-customsuite.xml
Retrying test Demo with status FAILURE for the 1 time(s).
Test ignored.
Retrying test Demo with status FAILURE for the 2 time(s).
Test ignored.
Retrying test Demo with status FAILURE for the 3 time(s).
Test ignored.
Retrying test Demo with status FAILURE for the 4 time(s).
Test ignored.
Retrying test Demo with status FAILURE for the 5 time(s).
Test ignored.
java.lang.AssertionError: null
at org.testng.Assert.fail(Assert.java:94)
at org.testng.Assert.fail(Assert.java:101)



at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
===============================================
Default Suite
Total tests run: 8, Failures: 2, Skips: 5
===============================================
Process finished with exit code 0
  方法二:通過testng.xml失敗重試
  與方法一比較,方法二需要再實現一個名為IAnnotationTransformer的接口。這個接口有一個transform方法,用來修改testcase的注解。這個方法的testannotation參數是testcase的注解。通過這個參數可以檢查注解中有沒有使用RetryAnalyzer,若沒有,則將自定義的Retry.class加入到注解中。
package main.java.com.dbyl.library.utils;
/**
* Created by wwh on 17/2/23.
*/
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import org.testng.IAnnotationTransformer;
import org.testng.IRetryAnalyzer;
import org.testng.annotations.ITestAnnotation;
public class RetryListener implements IAnnotationTransformer {
public void transform(ITestAnnotation testannotation, Class testClass,
Constructor testConstructor, Method testMethod)    {
IRetryAnalyzer retry = testannotation.getRetryAnalyzer();
if (retry == null)    {
testannotation.setRetryAnalyzer(Retry.class);//檢查注解中有沒有使用RetryAnalyzer,若沒有,則將自定義的Retry.class加入到注解中。
}
}
}
  接下來,還要在testng.xml中添加剛剛定義的RetryListener這個監聽器。
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Second suite" verbose="1" >
<listeners>
<listener class-name="main.java.com.dbyl.library.utils.RetryListener"></listener>
</listeners>
<test name = "allTestsInAClass" >
<classes>
<class name="main.java.com.dbyl.library.utils.TestRetry"/>
</classes>
</test>
</suite>
  使用的testng.xml的好處是,可以避免為每個需要重試的testcase添加注解,一切都在配置文件里完成。
  這里把RetryListener這個監聽器應用到了TestRetry這個類上,所以demo和demo2都會失敗重試。
  輸出結果如下:
[TestNG] Running:
/Users/wwh/IdeaProjects/ProjectWang/src/main/resources/testng.xml
Retrying test Demo with status FAILURE for the 1 time(s).
Test ignored.
Retrying test Demo with status FAILURE for the 2 time(s).
Test ignored.
Retrying test Demo with status FAILURE for the 3 time(s).
Test ignored.
Retrying test Demo with status FAILURE for the 4 time(s).
Test ignored.
Retrying test Demo with status FAILURE for the 5 time(s).
Test ignored.
java.lang.AssertionError: null
at org.testng.Assert.fail(Assert.java:94)



at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Retrying test Demo2 with status FAILURE for the 1 time(s).
Test ignored.
Retrying test Demo2 with status FAILURE for the 2 time(s).
Test ignored.
Retrying test Demo2 with status FAILURE for the 3 time(s).
Test ignored.
Retrying test Demo2 with status FAILURE for the 4 time(s).
Test ignored.
Retrying test Demo2 with status FAILURE for the 5 time(s).
Test ignored.
java.lang.AssertionError: null
at org.testng.Assert.fail(Assert.java:94)
at org.testng.Assert.fail(Assert.java:101)



at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
===============================================
Second suite
Total tests run: 13, Failures: 2, Skips: 10
===============================================
Process finished with exit code 0

軟件測試工具 | 聯系我們 | 投訴建議 | 誠聘英才 | 申請使用列表 | 網站地圖
滬ICP備07036474 2003-2017 版權所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd
主站蜘蛛池模板: 两个黑人一前一后好爽 | 成 人国产在线观看高清不卡 | 九九天天影视 | 国产午夜精品一二区理论影院 | 波多野野结衣1区二区 | 国产午夜不卡 | xxxx日本在线播放免费不卡 | 欧美日韩在线永久免费播放 | 小明日韩在线看看永久区域 | 91视频免费观看 | 天天爽天天爽 | 中国日韩欧美中文日韩欧美色 | 曰批全过程免费视频免费看 | 日韩亚州 | 免费的一极毛片在线播放 | 欧美日韩视频二区三区 | 在线观看毛片视频 | 一本大道香蕉视频在线观看 | 国产亚洲精品仙踪林在线播放 | 最近2019中文字幕无吗 | 小娜的荡高h放荡日记 | 国产欧美日韩在线视频 | 欧美日性 | 日本一区二区三区视频在线观看 | 日本高清乱理论片 | 成人国产激情福利久久精品 | 一级aa免费视频毛片 | 免费一级毛片能看的 | 成人短视频视频在线观看网站 | 成年人在线视频免费观看 | 欧美bbbbxxxx | 亚洲 欧美 中文 日韩专区 | 三a大片 | 丁香婷婷亚洲六月综合色 | 777成了人乱视频 | 成人影院免费观看 | 曰批全过程免费视频观看软件 | 一级免费视频 | yy毛片| 免费99视频有精品视频高清 | 天天插综合|