当前位置:   article > 正文

Java实现TestNg+ExtentReport实现接口测试,并生成测试报告_testng生成测试报告 extentreports

testng生成测试报告 extentreports

一  在pom.xml文件中引入TestNg以及ExtentReport包

<dependencies>
<!--testNg引入-->
<dependency>
    <groupId>org.testng</groupId>
    <artifactId>testng</artifactId>
    <version>6.9.10</version>
</dependency>
<!--extentreports 包-->
<!-- https://mvnrepository.com/artifact/com.aventstack/extentreports -->
<dependency>
    <groupId>com.aventstack</groupId>
    <artifactId>extentreports</artifactId>
    <version>3.0.6</version>
</dependency>

<!-- https://mvnrepository.com/artifact/com.vimalselvam/testng-extentsreport -->
<dependency>
    <groupId>com.vimalselvam</groupId>
    <artifactId>testng-extentsreport</artifactId>
    <version>1.3.1</version>
</dependency>

</dependencies>


二  ExtentTestNGIReporterListener类实现监听,并能生成报告

//解决样式加载不出来的问题

  1. package com.welab.automation.framework.listener;
  2. import com.aventstack.extentreports.ExtentReports;
  3. import com.aventstack.extentreports.ExtentTest;
  4. import com.aventstack.extentreports.ResourceCDN;
  5. import com.aventstack.extentreports.Status;
  6. import com.aventstack.extentreports.model.TestAttribute;
  7. import com.aventstack.extentreports.reporter.ExtentHtmlReporter;
  8. import com.aventstack.extentreports.reporter.configuration.ChartLocation;
  9. import com.aventstack.extentreports.reporter.configuration.Theme;
  10. import org.testng.*;
  11. import org.testng.xml.XmlSuite;
  12. import java.io.File;
  13. import java.text.SimpleDateFormat;
  14. import java.util.*;
  15. public class ExtentTestNGIReporterListener implements IReporter {
  16. static SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  17. static String dataNow=format.format(new Date());
  18. //生成的路径以及文件名
  19. private static final String OUTPUT_FOLDER = "test-output/";
  20. private static final String FILE_NAME = "测试报告.html";
  21. private ExtentReports extent;
  22. @Override
  23. public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites, String outputDirectory) {
  24. init();
  25. boolean createSuiteNode = false;
  26. if(suites.size()>1){
  27. createSuiteNode=true;
  28. }
  29. for (ISuite suite : suites) {
  30. Map<String, ISuiteResult> result = suite.getResults();
  31. //如果suite里面没有任何用例,直接跳过,不在报告里生成
  32. if(result.size()==0){
  33. continue;
  34. }
  35. //统计suite下的成功、失败、跳过的总用例数
  36. int suiteFailSize=0;
  37. int suitePassSize=0;
  38. int suiteSkipSize=0;
  39. ExtentTest suiteTest=null;
  40. //存在多个suite的情况下,在报告中将同一个一个suite的测试结果归为一类,创建一级节点。
  41. if(createSuiteNode){
  42. suiteTest = extent.createTest(suite.getName()).assignCategory(suite.getName());
  43. }
  44. boolean createSuiteResultNode = false;
  45. if(result.size()>1){
  46. createSuiteResultNode=true;
  47. }
  48. for (ISuiteResult r : result.values()) {
  49. ExtentTest resultNode;
  50. ITestContext context = r.getTestContext();
  51. if(createSuiteResultNode){
  52. //没有创建suite的情况下,将在SuiteResult的创建为一级节点,否则创建为suite的一个子节点。
  53. if( null == suiteTest){
  54. resultNode = extent.createTest(r.getTestContext().getName());
  55. }else{
  56. resultNode = suiteTest.createNode(r.getTestContext().getName());
  57. }
  58. }else{
  59. resultNode = suiteTest;
  60. }
  61. if(resultNode != null){
  62. resultNode.getModel().setName(suite.getName()+" : "+r.getTestContext().getName());
  63. System.out.println("suite.getName()-->"+suite.getName()+"\tr.getTestContext().getName()-->"+r.getTestContext().getName());
  64. if(resultNode.getModel().hasCategory()){
  65. resultNode.assignCategory(r.getTestContext().getName());
  66. }else{
  67. resultNode.assignCategory(suite.getName(),r.getTestContext().getName());
  68. }
  69. resultNode.getModel().setStartTime(r.getTestContext().getStartDate());
  70. resultNode.getModel().setEndTime(r.getTestContext().getEndDate());
  71. //统计SuiteResult下的数据
  72. int passSize = r.getTestContext().getPassedTests().size();
  73. int failSize = r.getTestContext().getFailedTests().size();
  74. int skipSize = r.getTestContext().getSkippedTests().size();
  75. suitePassSize += passSize;
  76. suiteFailSize += failSize;
  77. suiteSkipSize += skipSize;
  78. if(failSize>0){
  79. resultNode.getModel().setStatus(Status.FAIL);
  80. }
  81. resultNode.getModel().setDescription(String.format("Pass: %s ; Fail: %s ; Skip: %s ;",passSize,failSize,skipSize));
  82. }
  83. buildTestNodes(resultNode,context.getFailedTests(), Status.FAIL);
  84. buildTestNodes(resultNode,context.getSkippedTests(), Status.SKIP);
  85. buildTestNodes(resultNode,context.getPassedTests(), Status.PASS);
  86. }
  87. if(suiteTest!= null){
  88. suiteTest.getModel().setDescription(String.format("Pass: %s ; Fail: %s ; Skip: %s ;",suitePassSize,suiteFailSize,suiteSkipSize));
  89. if(suiteFailSize>0){
  90. suiteTest.getModel().setStatus(Status.FAIL);
  91. }
  92. }
  93. }
  94. // for (String s : Reporter.getOutput()) {
  95. // extent.setTestRunnerOutput(s);
  96. // }
  97. extent.flush();
  98. }
  99. private void init() {
  100. //文件夹不存在的话进行创建
  101. File reportDir= new File(OUTPUT_FOLDER);
  102. if(!reportDir.exists()&& !reportDir .isDirectory()){
  103. reportDir.mkdir();
  104. }
  105. ExtentHtmlReporter htmlReporter = new ExtentHtmlReporter(OUTPUT_FOLDER + FILE_NAME);
  106. // 设置静态文件的DNS
  107. //怎么样解决cdn.rawgit.com访问不了的情况
  108. htmlReporter.config().setResourceCDN(ResourceCDN.EXTENTREPORTS);
  109. htmlReporter.config().setDocumentTitle("api自动化测试报告");
  110. htmlReporter.config().setReportName("api自动化测试报告");
  111. htmlReporter.config().setChartVisibilityOnOpen(true);
  112. htmlReporter.config().setTestViewChartLocation(ChartLocation.TOP);
  113. htmlReporter.config().setTheme(Theme.STANDARD);
  114. htmlReporter.config().setCSS(".node.level-1 ul{ display:none;} .node.level-1.active ul{display:block;}");
  115. extent = new ExtentReports();
  116. extent.attachReporter(htmlReporter);
  117. extent.setReportUsesManualConfiguration(true);
  118. }
  119. private void buildTestNodes(ExtentTest extenttest, IResultMap tests, Status status) {
  120. //存在父节点时,获取父节点的标签
  121. String[] categories=new String[0];
  122. if(extenttest != null ){
  123. List<TestAttribute> categoryList = extenttest.getModel().getCategoryContext().getAll();
  124. categories = new String[categoryList.size()];
  125. for(int index=0;index<categoryList.size();index++){
  126. categories[index] = categoryList.get(index).getName();
  127. }
  128. }
  129. ExtentTest test;
  130. if (tests.size() > 0) {
  131. //调整用例排序,按时间排序
  132. Set<ITestResult> treeSet = new TreeSet<ITestResult>(new Comparator<ITestResult>() {
  133. @Override
  134. public int compare(ITestResult o1, ITestResult o2) {
  135. return o1.getStartMillis()<o2.getStartMillis()?-1:1;
  136. }
  137. });
  138. treeSet.addAll(tests.getAllResults());
  139. for (ITestResult result : treeSet) {
  140. Object[] parameters = result.getParameters();
  141. String name="";
  142. //如果有参数,则使用参数的toString组合代替报告中的name
  143. for(Object param:parameters){
  144. name+=param.toString();
  145. }
  146. if(name.length()>0){
  147. if(name.length()>50){
  148. name= name.substring(0,49)+"...";
  149. }
  150. }else{
  151. name = result.getMethod().getMethodName();
  152. }
  153. if(extenttest==null){
  154. test = extent.createTest(name);
  155. }else{
  156. //作为子节点进行创建时,设置同父节点的标签一致,便于报告检索。
  157. test = extenttest.createNode(name).assignCategory(categories);
  158. }
  159. //test.getModel().setDescription(description.toString());
  160. //test = extent.createTest(result.getMethod().getMethodName());
  161. for (String group : result.getMethod().getGroups()) {
  162. test.assignCategory(group);
  163. test.assignCategory(result.getMethod().getDescription());//描述
  164. }
  165. List<String> outputList = Reporter.getOutput(result);
  166. for(String output:outputList){
  167. //将用例的log输出报告中
  168. test.debug(output);
  169. }
  170. if (result.getThrowable() != null) {
  171. test.log(status, result.getThrowable());
  172. }
  173. else {
  174. test.log(status, "Test " + status.toString().toLowerCase() + "ed");
  175. }
  176. test.getModel().setStartTime(getTime(result.getStartMillis()));
  177. test.getModel().setEndTime(getTime(result.getEndMillis()));
  178. }
  179. }
  180. }
  181. private Date getTime(long millis) {
  182. Calendar calendar = Calendar.getInstance();
  183. calendar.setTimeInMillis(millis);
  184. return calendar.getTime();
  185. }
  186. }

三 在要运行的测试的xml中添加监听

在resources的testng.xml中添加监听

<?xml version="1.0" encoding="UTF-8" ?>
<!--测试运行以及输出测试报告-->
<suite name="我自己的接口测试套件">
    <test name="这些是测试模块">
        <classes>
            <class name="com.extend.demo.TestMethodsDemo">
                <!--运行的方法-->
             <methods>
                 <include name="test1"></include>
                 <include name="test2"></include>
                 <include name="test3"></include>
                 <include name="logDemo"></include>

             </methods>
            </class>
        </classes>
    </test>
    <!--监听器  测试报告-->
    <listeners>
        <listener class-name="com.extend.demo.ExtentTestNGIReporterListener"></listener>
    </listeners>
</suite>

四 测试并查看报告

选中resources文件中的testng.xml文件,右击选择运行,执行成功以后,可以在test-output文件夹中查看到输出的测试报告

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/150247
推荐阅读
相关标签
  

闽ICP备14008679号