!!!testng增加失敗重跑機制
http://www.yeetrack.com/?p=1015
使用Testng框架搭建自動測試框架,經常會需要增加失敗自動截圖,以及失敗重跑功能,一般有兩種方式,①修改testng的原始碼;②使用testng的listener。修改testng原始碼的方式不推薦;第二種方法,網易qa的一片文章介紹的比較全了,直接轉過來,http://qa.blog.163.com/blog/static/19014700220138585422735/,不過解決失敗重跑的case計入總case數的問題,程式碼寫得較繁瑣,修改了下。
自動截圖功能
1、新建一個Java類繼承TestListenerAdapter
2、重寫onTestFailure、onTestSkipped等方法,在這些方法中加入截圖操作
3、在testng.xml檔案中配置自己編寫的監聽器類
<listeners>
<listener class-name=“***.testng.TestngListener”
/>
</listeners>
public class
TestngListener extends TestListenerAdapter
{
private static
Logger logger =
Logger.getLogger(TestngListener.class);
public static
final String CONFIG =
“config.properties”;
@Override
public void
super.onTestFailure(tr);
logger.info(tr.getName() + ” Failure”);
takeScreenShot(tr);
}
@Override
public void onTestSkipped(ITestResult tr)
{
super.onTestSkipped(tr);
logger.info(tr.getName()
+ ” Skipped”);
takeScreenShot(tr);
}
@Override
public void onTestSuccess(ITestResult tr
super.onTestSuccess(tr);
logger.info(tr.getName() + ” Success”);
}
@Override
public void onTestStart(ITestResult tr)
{
super.onTestStart(tr);
logger.info(tr.getName()
+ ” Start”);
}
@Override
public void onFinish(ITestContext testContext)
{
super.onFinish(testContext);
}
/**
* 自動截圖,儲存圖片到本地以及html結果檔案中
*
* @param tr
*/
private void takeScreenShot(ITestResult tr)
{
SimpleDateFormat formatter =
new SimpleDateFormat(“yyyy_MM_dd_HH_mm_ss”);
String mDateTime = formatter.format(new
Date());
String fileName = mDateTime
+ “_”
+ tr.getName();
String filePath =
OrangeiOS.driver.getScreenshotAs(fileName);
Reporter.setCurrentTestResult(tr);
Reporter.log(filePath);
//這裡實現把圖片連結直接輸出到結果檔案中,通過郵件傳送結果則可以直接顯示圖片
Reporter.log(“<img src=\”../”
+ filePath +
“\”/>”);
}
失敗自動重跑功能
1、新建Java類實現IRetryAnalyzer介面
public class
TestngRetry implements IRetryAnalyzer
{
private static
Logger logger =
Logger.getLogger(TestngRetry.class);
private int retryCount
= 1;
private static
int maxRetryCount;
private static
ConfigReader config;
static {
//外圍檔案配置最大執行次數
config = new
ConfigReader(TestngListener.CONFIG);
maxRetryCount = config.getMaxRunCount();
logger.info(“maxRunCount=”
+ (maxRetryCount));
}
@Override
public boolean
retry(ITestResult result)
{
if (retryCount
<= maxRetryCount)
{
String message =
“running retry for ‘” + result.getName()
+ “‘ on class “
+
this.getClass().getName()
+ ” Retrying “
+ retryCount +
” times”;
logger.info(message);
Reporter.setCurrentTestResult(result);
Reporter.log(“RunCount=”
+ (retryCount
+ 1));
retryCount++;
return true;
}
return false;
}
}
2、新建Java類實現IAnnotationTransformer介面
public class RetryListener implements IAnnotationTransformer {
@Override
public void transform(ITestAnnotation annotation,
Class testClass,
Constructor testConstructor,
Method testMethod)
{
IRetryAnalyzer retry
= annotation.getRetryAnalyzer();
if (retry
== null)
{
annotation.setRetryAnalyzer(TestngRetry.class);
}
}
}
3、在build.xml或者testng.xml檔案中新增RetryListener監聽器
上面三步就可以實現失敗自動重跑了,是不是比較方便,不過添加了重跑功能後會發現測試結果的郵件中用例的個數增加了,比如我只有一個用例,失敗重跑了2次,一共執行3次,測試結果中顯示的用例個數會是3個,那接下來就需要解決這個問題了。
首先解決TestNg生成的index.html檔案中個數不對的問題,這個問題只需要在Testng監聽器的onFinish方法中,等所有用例執行完之 後,檢查用例,按照class+method+dataprodiver的名稱生成hashcode獲取唯一id,如果fail的用例中存在重複的則在 fail的用例中剔除掉,具體程式碼如下:這個網易qa的那篇文章寫得比較繁瑣,參考另一篇 http://martinholladay.wordpress.com/2013/11/16/testng-adjusting-test-counts-on-retry/
@Override
public void onFinish(ITestContext iTestContext) {
Iterator<ITestResult> listOfFailedTests = iTestContext.getFailedTests().getAllResults().iterator();
while (listOfFailedTests.hasNext()) {
ITestResult failedTest = listOfFailedTests.next();
ITestNGMethod method = failedTest.getMethod();
if (iTestContext.getFailedTests().getResults(method).size() > 1) {
listOfFailedTests.remove();
} else {
if (iTestContext.getPassedTests().getResults(method).size() > 0) {
listOfFailedTests.remove();
}
}
}
}
當前失敗重跑也存在一些小問題:
1、setup中出現的錯誤直接是skip的,不會重跑
2、如果存在dataprodiver,則第二組資料以後的用例是不會重跑的
3、testng自帶生成的emailable-report.html檔案中用例的個數也不對了,這個問題可以自行修改EmailableReporter.java檔案
如何修改自定義emailable-report.html
emailable-report.html是Testng執行完成後自動生成的,經常執行結束後我們會把這個檔案作為郵件正文傳送給收件人,如果我們要修改這個檔案內容怎麼辦呢?
1、首先emailable-report.html檔案的生成TestNG是實現了IReporter介面,那我們可以直接從原始碼中取出這個檔案原始碼
https://github.com/cbeust/testng/blob/master/src/main/java/org/testng/reporters/EmailableReporter.java
2、針對原始碼進行自己修改
3、把修改後的原始碼加入自己的工程
4、在build.xml檔案中新增自定義的監聽器,執行時就會呼叫自定義的監聽器生成想要的html檔案了
<testng outputDir=“test-output”
classpathref=“http://qa.blog.163.com/blog/runpath”
haltonfailure=“false”
listeners=“com.****.CustomerEmailableReport”
>
<xmlfileset dir=“.”
includes=“${testngxml}.xml”
/>
</testng>