走進Java介面測試之測試報告ExtentReport

zuozewei發表於2018-12-15

引言

在上文走進Java介面測試之測試框架TestNG
中我們詳細介紹了 TestNG 的各種用法, 在本文中,我將詳細介紹如何將 ExtentReports 測試報告與TestNG整合。

ExtentReports 簡介

主要特點:

  • 生成的報告簡潔美觀
  • 生成的單html方便 Jenkins 整合發郵件
  • 自帶集中展示歷史報告的服務端
  • 支援 Java 和 .Net

TestNG 原生報告有點醜,資訊整理有點亂。ExtentReports 是用於替換TestNG 原生報告。當然也可以使用 ReportNg,個人偏好 ExtentReports 樣式。

官網已經給了很多demo了,大家可以參考練習,這裡根據個人經驗進行了配置。
官網:http://extentreports.com/
客戶端:https://github.com/anshooarora/extentreports-java/commits/master
服務端:https://github.com/anshooarora/extentx

具體步驟

Step-1:新增 Maven 依賴包

引入pom.xml


        <!--引入extentreports相關包-->
        <dependency>
            <groupId>com.aventstack</groupId>
            <artifactId>extentreports</artifactId>
            <version>3.1.5</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.vimalselvam</groupId>
            <artifactId>testng-extentsreport</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>com.relevantcodes</groupId>
            <artifactId>extentreports</artifactId>
            <version>2.41.2</version>
        </dependency>
        <!--引入testng測試框架-->
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.14.3</version>
            <scope>compile</scope>
        </dependency>

Step-2:重寫 ExtentTestNgFormatter 類

主要基於以下兩項原因:

  • 支援報告中展示更多狀態型別的測試結果,例如:成功、失敗、警告、跳過等。
  • 因為不支援cdn.rawgit.com訪問,故替css訪問方式。

建立 MyExtentTestNgFormatter 類

下載 ExtentReportes 原始碼,找到 ExtentTestNgFormatter 類,Listener 目錄下建立 MyExtentTestNgFormatter.java 類直接繼承 ExtentTestNgFormatter 類。

public class MyExtentTestNgFormatter extends ExtentTestNgFormatter {

解決CDN無法訪問

構造方法加入

htmlReporter.config().setResourceCDN(ResourceCDN.EXTENTREPORTS); 

具體程式碼如下:

ublic MyExtentTestNgFormatter() {
      setInstance(this);
      testRunnerOutput = new ArrayList<>();
      String reportPathStr = System.getProperty("reportPath");
      File reportPath;

      try {
          reportPath = new File(reportPathStr);
      } catch (NullPointerException e) {
          reportPath = new File(TestNG.DEFAULT_OUTPUTDIR);
      }

      if (!reportPath.exists()) {
          if (!reportPath.mkdirs()) {
              throw new RuntimeException("Failed to create output run directory");
          }
      }

      File reportFile = new File(reportPath, "report.html");
      File emailReportFile = new File(reportPath, "emailable-report.html");

      htmlReporter = new ExtentHtmlReporter(reportFile);
      EmailReporter emailReporter = new EmailReporter(emailReportFile);
      reporter = new ExtentReports();
      //        如果cdn.rawgit.com訪問不了,可以設定為:ResourceCDN.EXTENTREPORTS或者ResourceCDN.GITHUB
      htmlReporter.config().setResourceCDN(ResourceCDN.EXTENTREPORTS);
      reporter.attachReporter(htmlReporter, emailReporter);
  }

重寫 onstart 方法

重寫onstart 方法功能。新建一個類名為MyReporter,一個靜態ExtentTest的引用。

Listener 包下 MyReporter.java

public class MyReporter {
        public static ExtentTest report;
    }

MyExtentTestNgFormatter.java

public void onStart(ITestContext iTestContext) {
        ISuite iSuite = iTestContext.getSuite();
        ExtentTest suite = (ExtentTest) iSuite.getAttribute(SUITE_ATTR);
        ExtentTest testContext = suite.createNode(iTestContext.getName());
        // 將MyReporter.report靜態引用賦值為testContext。
        // testContext是@Test每個測試用例時需要的。report.log可以跟隨具體的測試用例。另請查閱原始碼。
        MyReporter.report = testContext;
        iTestContext.setAttribute("testContext", testContext);
    }

自定義配置

測試報告預設是在工程根目錄下建立 test-output/ 資料夾下,名為report.htmlemailable-report.html。可根據各自需求在構造方法中修改。

    public MyExtentTestNgFormatter() {
        setInstance(this);
        testRunnerOutput = new ArrayList<>();
        // reportPath報告路徑
        String reportPathStr = System.getProperty("reportPath");
        File reportPath;

        try {
            reportPath = new File(reportPathStr);
        } catch (NullPointerException e) {
            reportPath = new File(TestNG.DEFAULT_OUTPUTDIR);
        }

        if (!reportPath.exists()) {
            if (!reportPath.mkdirs()) {
                throw new RuntimeException("Failed to create output run directory");
            }
        }
        // 報告名report.html
        File reportFile = new File(reportPath, "report.html");
        // 郵件報告名emailable-report.html
        File emailReportFile = new File(reportPath, "emailable-report.html");

        htmlReporter = new ExtentHtmlReporter(reportFile);
        EmailReporter emailReporter = new EmailReporter(emailReportFile);
        reporter = new ExtentReports();
        reporter.attachReporter(htmlReporter, emailReporter);
    }

report.log

report.log 支援多種玩法

// 根據狀態不同新增報告。型如警告
MyReporter.report.log(Status.WARNING, "介面耗時(ms):" + String.valueOf(time));

直接從TestClass 中執行時會報 MyReporter.report 的空指標錯誤,需做判空處理。

Step-3:配置監聽

在測試集合 testng.xml 檔案中匯入 Listener 監聽類。

    <listeners>
        <listener class-name="com.zuozewei.extentreportdemo.listener.MyExtentTestNgFormatter"/>
    </listeners>	

Step-4:配置報告

extent reporters支援報告的配置。目前支援的配置內容有title、主題等。
先在src/resources/目錄下新增 config/report/extent-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<extentreports>
    <configuration>
        <timeStampFormat>yyyy-MM-dd HH:mm:ss</timeStampFormat>
        <!-- report theme -->
        <!-- standard, dark 個人喜好暗色 -->
        <theme>dark</theme>

        <!-- document encoding -->
        <!-- defaults to UTF-8 -->
        <encoding>UTF-8</encoding>

        <!-- protocol for script and stylesheets -->
        <!-- defaults to https -->
        <protocol>https</protocol>

        <!-- title of the document -->
        <documentTitle>QA-介面自動化測試報告</documentTitle>

        <!-- report name - displayed at top-nav -->
        <reportName>QA-介面自動化測試報告</reportName>

        <!-- report headline - displayed at top-nav, after reportHeadline -->
        <reportHeadline>介面自動化測試報告</reportHeadline>

        <!-- global date format override -->
        <!-- defaults to yyyy-MM-dd -->
        <dateFormat>yyyy-MM-dd</dateFormat>

        <!-- global time format override -->
        <!-- defaults to HH:mm:ss -->
        <timeFormat>HH:mm:ss</timeFormat>

        <!-- custom javascript -->
        <scripts>
            <![CDATA[
        $(document).ready(function() {

        });
      ]]>
        </scripts>

        <!-- custom styles -->
        <styles>
            <![CDATA[

      ]]>
        </styles>
    </configuration>
</extentreports>

Step-5:配置系統系統

config下新建 MySystemInfo類繼承 SystemInfo 介面

public class MySystemInfo implements SystemInfo {
    @Override
    public Map<String, String> getSystemInfo() {

        Map<String, String> systemInfo = new HashMap<>();
        systemInfo.put("測試人員", "zuozewei");

        return systemInfo;
    }
}

可用於新增系統資訊,例如:db的配置資訊,人員資訊,環境資訊等。根據專案實際情況新增。
至此,extentreports 美化報告完成。

Step-6:新增測試用例

public class TestMethodsDemo {

    @Test
    public void test1(){
        Assert.assertEquals(1,2);
    }

    @Test
    public void test2(){
        Assert.assertEquals(1,1);
    }


    @Test
    public void test3(){
        Assert.assertEquals("aaa","aaa");
    }


    @Test
    public void logDemo(){
        Reporter.log("這是故意寫入的日誌");
        throw new RuntimeException("故意執行時異常");
    }
}

Step-7:測試用例suite

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="測試demo" verbose="1" preserve-order="true">
    <parameter name="report.config" value="src/main/resources/report/extent-config.xml"/>
    <parameter name="system.info" value="com.zuozewei.extentreportdemo.config.MySystemInfo"/>

    <test name="測試demo" preserve-order="true">
        <classes>
            <class name="com.zuozewei.extentreportdemo.testCase.TestMethodsDemo"/>
        </classes>
    </test>

    <listeners>
        <listener class-name="com.zuozewei.extentreportdemo.listener.MyExtentTestNgFormatter"/>
    </listeners>
</suite>

測試報告

HTML Resport 示例

在這裡插入圖片描述

Email Report 示例

在這裡插入圖片描述

工程目錄

在這裡插入圖片描述

原始碼地址:https://github.com/zuozewei/Java-API-Test-Examples

相關文章