Java+Selenium+Testng-web UI自动化测试框架-8生成测试报告

本文提供两种生成测试报告的方法,第一种使用ReportNG,第二种自己重写Report Listener。

一:

先说第一种,使用ReportNG。

1. 首先下载ReportNG的架包,添加到project中。

2. 然后取消使用TestNG默认的监听器,右键工程->Properties->TestNG->勾选Disable default listeners。

Java+Selenium+Testng-web UI自动化测试框架-8生成测试报告_第1张图片

3. 然后在testng.xml文件中加入下面内容,规定运行时使用reportng生成report。


     
     

Java+Selenium+Testng-web UI自动化测试框架-8生成测试报告_第2张图片

4. 之后再运行.xml文件时,就会生成类似下面样式的的测试报告了。

Java+Selenium+Testng-web UI自动化测试框架-8生成测试报告_第3张图片

 

二:

接下来介绍第二种重写Report Listener,用htlm拼接生成report。本框架当前采用的是这种方式。

1. 在util包下创建一个class ReportListener,

package util;  
  
import java.io.File;  
import java.io.IOException;  
import java.nio.file.Files;  
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import org.testng.ITestContext;
import org.testng.ITestResult;  
import org.testng.TestListenerAdapter;

/**
 * 生成测试报告.
 */
public class ReportListener extends TestListenerAdapter{  
    
    private static String reportPath;
    private static int pass = 0;
    private static int fail = 0;
    private static int skip = 0;
    private static int all;
    private static float successRate;
    private static StringBuilder s1;
    private static StringBuilder s2;
    private static Date begin;
    private static Date finish;
    private static long duration;
    static List screenshotPaths = new ArrayList();
  
    @Override  
    public void onStart(ITestContext context) {  
        File htmlReportDir = new File("test-output/report");    
        if (!htmlReportDir.exists()) {    
            htmlReportDir.mkdirs();    
        }    
        String reportName = formateDate()+".html";    
        reportPath = htmlReportDir+"/"+reportName;    
        File report = new File(htmlReportDir,reportName);    
        if(report.exists()){    
            try {    
                report.createNewFile();    
            } catch (IOException e) {    
                e.printStackTrace();    
            }    
        }    
        s1 = new StringBuilder(""  
                + "UI自动化测试报告"  
                + "

Test Results Report

"   
                + ""
                + ""
                + ""
                + ""
                + ""
                + ""
                + ""
                + ""
                + ""
                + ""
                + ""
                + "");  
        s2 = new StringBuilder("

详情列表

"
                + "
OverviewTestsPassedSkippedFailedSuccess rateDuration(s)
"  
                + ""  
                + ""  
                + ""  
                + ""  
                + "" 
                + ""  
                + ""  
                + ""); 
        begin = new Date();

        
    }  
      
    @Override  
    public void onTestSuccess(ITestResult result) {  
        StringBuilder sb2 = new StringBuilder("

");         
        long time =
                (result.getEndMillis() - result.getStartMillis())/1000;
        sb2.append("");       
        s2.append(sb2);
        pass = pass+1;
    }  
  
    @Override  
    public void onTestSkipped(ITestResult result) {  
        //加了case失败后冲泡的方法,于是失败的case只有最后一次是faied的状态,前面几次都是skied的状态,所以去掉skipped的报告,这样虽然可能会影响到真正的skipped的case,但是如果保证setup方法不挂掉正常case是不会skipped的
/*        StringBuilder sb2 = new StringBuilder("");  
  
        long time =
                (result.getEndMillis() - result.getStartMillis())/1000;
        sb2.append("");       
        s2.append(sb2);
        skip = skip+1;*/
    }  
      
    @Override  
    public void onTestFailure(ITestResult result) {  
        String error;
        try {            
        StringBuilder sb2 = new StringBuilder("");  
        
        long time =
                (result.getEndMillis() - result.getStartMillis())/1000;
        sb2.append("");       
        s2.append(sb2);
        fail = fail+1;
        String classname = result.getTestClass().getName();
        String methodname = result.getMethod().getMethodName();
        TakeScreenshot shot = new TakeScreenshot();
        String screenshotPath = shot.takeScreenShot(classname, methodname);
        screenshotPaths.add(screenshotPath);       
        }
        catch(Exception e) {
            //没有Throwable的时候,比如login或logout的时候挂了,exception被catch住了就没有Throwable抛出来
            StringBuilder sb2 = new StringBuilder("");
            long time =
                    (result.getEndMillis() - result.getStartMillis())/1000;
            sb2.append("");       
            s2.append(sb2);
            fail = fail+1;
            String classname = result.getTestClass().getName();
            String methodname = result.getMethod().getMethodName();
            TakeScreenshot shot = new TakeScreenshot();
            String screenshotPath = shot.takeScreenShot(classname, methodname);
            screenshotPaths.add(screenshotPath);
            Log4jUtil.error(e);
        }
    }  
  
    @Override  
    public void onFinish(ITestContext testContext) {
        all = fail + pass + skip;
        successRate = (float)pass/(float)all*100;
        finish = new Date();
        duration = (finish.getTime()-begin.getTime())/1000;
        StringBuilder sb1 = new StringBuilder(""
                + ""
                + ""
                + ""
                + ""
                + ""
                + ""
                + ""
                + ""
                + ""
                + ""
                + "
测试用例测试用例结果Duration(s)
");  
        sb2.append((result.getMethod().getRealClass()+"."+result.getMethod().getMethodName()).substring(16));  
        sb2.append("
Passed" + time + "
");  
        sb2.append((result.getMethod().getRealClass()+"."+result.getMethod().getMethodName()).substring(16));  
        sb2.append("
Skipped
");
        sb2.append(result.getMethod().getMethodName());
        sb2.append("

测试用例跳过

" + time + "
");    
        sb2.append((result.getMethod().getRealClass()+"."+result.getMethod().getMethodName()).substring(16));    
        sb2.append("
Failed
"); 
        sb2.append(result.getTestName());
        sb2.append("

用例执行失败,原因:
");  
        sb2.append("
");          
        Throwable throwable = result.getThrowable();    
        if(throwable.getMessage().indexOf("Session info")!=-1) 
        {
            int endIndex = throwable.getMessage().indexOf("(Session info");     
            error = throwable.getMessage().substring(0, endIndex);
         }
        else 
        {
            error = throwable.getMessage();//断言失败只打印断言
        }
        sb2.append(error);
        sb2.append("

" + time + "
");    
            sb2.append((result.getMethod().getRealClass()+"."+result.getMethod().getMethodName()).substring(16));    
            sb2.append("
Failed
"); 
            sb2.append(result.getTestName());
            sb2.append("

用例执行失败,原因:
");  
            sb2.append("
"); 
            sb2.append(e);
            sb2.append("

" + time + "
Smoke" + all + "" + pass + "" + skip + "" + fail + "" + String.format("%.2f", successRate) + "%" + "" + duration + "
");

        StringBuilder sb2 = new StringBuilder("返回顶部

");  
        sb2.append("

2. 然后在testng.xml文件中加入下面内容

 
         
 

Java+Selenium+Testng-web UI自动化测试框架-8生成测试报告_第4张图片

3. 同样要取消使用TestNG默认的监听器,之后再运行.xml文件时,就会生成类似下面样式的的测试报告了。

Java+Selenium+Testng-web UI自动化测试框架-8生成测试报告_第5张图片

 

你可能感兴趣的:(UI自动化)