IReporter接口是干嘛的?就是让用户自定义报告的,很多人想要自定义报告,于是乎找各种插件,比如什么testng-xslt啊,reportng啊,各种配置,最后出来的结果,还不能定制化,但为什么不能自已定制一份呢?testng的IReporter接口就接供了这样的功能,我们只需要实现这个接口,并加上监听,就能拿到所有的信息了,你可以把这些信息存数据库,或者自已生成一个html,亦或者写在EXCEL里啊等等,都可以,下面给出IReporter接口的实现方式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
package
com.demo;
import
java.io.BufferedWriter;
import
java.io.File;
import
java.io.FileWriter;
import
java.io.IOException;
import
java.text.SimpleDateFormat;
import
java.util.ArrayList;
import
java.util.Collections;
import
java.util.Comparator;
import
java.util.List;
import
java.util.Map;
import
java.util.Set;
import
org.testng.IReporter;
import
org.testng.IResultMap;
import
org.testng.ISuite;
import
org.testng.ISuiteResult;
import
org.testng.ITestContext;
import
org.testng.ITestResult;
import
org.testng.xml.XmlSuite;
public
class
NewReport
implements
IReporter{
@Override
public
void
generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites, String outputDirectory) {
List<ITestResult> list =
new
ArrayList<ITestResult>();
for
(ISuite suite : suites) {
Map<String, ISuiteResult> suiteResults = suite.getResults();
for
(ISuiteResult suiteResult : suiteResults.values()) {
ITestContext testContext = suiteResult.getTestContext();
IResultMap passedTests = testContext.getPassedTests();
IResultMap failedTests = testContext.getFailedTests();
IResultMap skippedTests = testContext.getSkippedTests();
IResultMap failedConfig = testContext.getFailedConfigurations();
list.addAll(
this
.listTestResult(passedTests));
list.addAll(
this
.listTestResult(failedTests));
list.addAll(
this
.listTestResult(skippedTests));
list.addAll(
this
.listTestResult(failedConfig));
}
}
this
.sort(list);
this
.outputResult(list, outputDirectory+
"/test.txt"
);
}
private
ArrayList<ITestResult> listTestResult(IResultMap resultMap){
Set<ITestResult> results = resultMap.getAllResults();
return
new
ArrayList<ITestResult>(results);
}
private
void
sort(List<ITestResult> list){
Collections.sort(list,
new
Comparator<ITestResult>() {
@Override
public
int
compare(ITestResult r1, ITestResult r2) {
if
(r1.getStartMillis()>r2.getStartMillis()){
return
1
;
}
else
{
return
-
1
;
}
}
});
}
private
void
outputResult(List<ITestResult> list, String path){
try
{
BufferedWriter output =
new
BufferedWriter(
new
FileWriter(
new
File(path)));
StringBuffer sb =
new
StringBuffer();
for
(ITestResult result : list) {
if
(sb.length()!=
0
){
sb.append(
"\r\n"
);
}
sb.append(result.getTestClass().getRealClass().getName())
.append(
" "
)
.append(result.getMethod().getMethodName())
.append(
" "
)
.append(
this
.formatDate(result.getStartMillis()))
.append(
" "
)
.append(result.getEndMillis()-result.getStartMillis())
.append(
"毫秒 "
)
.append(
this
.getStatus(result.getStatus()));
}
output.write(sb.toString());
output.flush();
output.close();
}
catch
(IOException e) {
e.printStackTrace();
}
}
private
String getStatus(
int
status){
String statusString =
null
;
switch
(status) {
case
1
:
statusString =
"SUCCESS"
;
break
;
case
2
:
statusString =
"FAILURE"
;
break
;
case
3
:
statusString =
"SKIP"
;
break
;
default
:
break
;
}
return
statusString;
}
private
String formatDate(
long
date){
SimpleDateFormat formatter =
new
SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss"
);
return
formatter.format(date);
}
}
|
代码简单易懂,下面给一个测试类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
package
com.demo;
import
org.testng.Assert;
import
org.testng.annotations.DataProvider;
import
org.testng.annotations.Listeners;
import
org.testng.annotations.Test;
@Listeners
({com.demo.NewReport.
class
})
public
class
Test15 {
@DataProvider
public
Object[][] dataProvider(){
return
new
Object[][]{{
1
},{
2
}};
}
@Test
(dataProvider=
"dataProvider"
)
public
void
testAssert1(
int
a){
Assert.assertEquals(
1
, a);
}
@Test
public
void
testAssert2(){
Assert.assertEquals(
"2"
,
"2"
);
}
}
|
运行后,大家打开test-output文件夹,看是不是多了个test.txt的文件夹。截图如下: