在使用testng生成報告的時候,只會記錄test方法中的日誌,可是通常會在beforeMethod、beforeTest、afterMethod、afterTest中作一下數據的處理,這裏面的日誌沒辦法在test中顯示。查看了testng的源碼,發現suite中的getAllInvokedMethods方法會返回全部調用過的方法,包括test、after、before等。拿到了全部方法執行的結果,就能夠進行處理,把beforeMethod、beforeTest、afterMethod、afterTest中的數據整合到對應的test中。java
第一步:下載testng源碼到本地:git
git clone -b testng-6.8.9 git@github.com:cbeust/testng.gitgithub
修改接口ITestResult和他的實現類TestResult代碼以下:maven
在ITestResult添加代碼:ide
List<String> log = new ArrayList<String>(); void setLog(List<String> log); List<String> getLog();
在TestResult中添加代碼:ui
private List<String> log; public void setLog(List<String> log) { this.log = log; } public List<String> getLog() { return log; }
使用maven打包,要把依賴打進去,因此在pom中添加:this
<plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
mvn cleanspa
mvn package日誌
生成須要的jar包code
第二步:
把jar包放到咱們的工程目錄中(新建lib目錄,放到lib下)
工程中pom添加,同時刪掉原來有的testng依賴:
<dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.8.8</version> <scope>system</scope> <systemPath>${project.basedir}/lib/testng-6.8.8.jar</systemPath> </dependency>
第三步:如何使用
新建類實現IReporter接口:
package test.service;import org.testng.*;import org.testng.xml.XmlSuite;import java.util.*;public class CustomReporter implements IReporter{ @Override public void generateReport(List<XmlSuite> xmlSuite, List<ISuite> suites, String s) { List<ITestResult> list = new ArrayList<>(); List<IInvokedMethod> allInvokedMethodsList = new ArrayList<>(); for (ISuite suite : suites) { Map<String, ISuiteResult> suiteResults = suite.getResults(); List<IInvokedMethod> allInvokedMethods = suite.getAllInvokedMethods(); //排序 Collections.sort(allInvokedMethods, new Comparator<IInvokedMethod>() { @Override public int compare(IInvokedMethod o1, IInvokedMethod o2) { return Long.valueOf(o1.getTestResult().getStartMillis()).compareTo(Long.valueOf(o2.getTestResult().getStartMillis())); } }); } for(int i=0;i<allInvokedMethodsList.size();i++){ IInvokedMethod iInvokedMethod = allInvokedMethodsList.get(i); ITestResult itestResult = iInvokedMethod.getTestResult(); ITestNGMethod iTestNGMethod = itestResult.getMethod(); if(iTestNGMethod.isTest()){ if(i-1>=0){ ITestResult tmpTestResult = allInvokedMethodsList.get(i-1).getTestResult(); if(tmpTestResult.getMethod().isBeforeTestConfiguration() || tmpTestResult.getMethod().isBeforeMethodConfiguration()){ List<String> log = new ArrayList<>(); log.addAll(Reporter.getOutput(tmpTestResult)); log.addAll(Reporter.getOutput(itestResult)); itestResult.setLog(log); } } if(i+1<allInvokedMethodsList.size()){ ITestResult tmpTestResult = allInvokedMethodsList.get(i+1).getTestResult(); if(tmpTestResult.getMethod().isAfterClassConfiguration() || tmpTestResult.getMethod().isAfterMethodConfiguration()){ List<String> log = new ArrayList<>(); log.addAll(Reporter.getOutput(itestResult)); log.addAll(Reporter.getOutput(tmpTestResult)); itestResult.setLog(log); } } list.add(itestResult); } } }}