原理:
1.自已构造一个断言类,把Assert.assertEquals给try catch住。
2.利用testng的监听类在测试方法运行结束后进行分析。
代码:
断言类:
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
|
package
com.demo;
import
java.util.ArrayList;
import
java.util.List;
import
org.testng.Assert;
public
class
Assertion {
public
static
boolean
flag =
true
;
public
static
List
new
ArrayList
public
static
void
verifyEquals(Object actual, Object expected){
try
{
Assert.assertEquals(actual, expected);
}
catch
(Error e){
errors.add(e);
flag =
false
;
}
}
public
static
void
verifyEquals(Object actual, Object expected, String message){
try
{
Assert.assertEquals(actual, expected, message);
}
catch
(Error e){
errors.add(e);
flag =
false
;
}
}
}
|
监听类:
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
|
package
com.demo;
import
java.util.ArrayList;
import
java.util.List;
import
org.testng.ITestResult;
import
org.testng.TestListenerAdapter;
public
class
AssertionListener
extends
TestListenerAdapter {
@Override
public
void
onTestStart(ITestResult result) {
Assertion.flag =
true
;
Assertion.errors.clear();
}
@Override
public
void
onTestFailure(ITestResult tr) {
this
.handleAssertion(tr);
}
@Override
public
void
onTestSkipped(ITestResult tr) {
this
.handleAssertion(tr);
}
@Override
public
void
onTestSuccess(ITestResult tr) {
this
.handleAssertion(tr);
}
private
int
index =
0
;
private
void
handleAssertion(ITestResult tr){
if
(!Assertion.flag){
Throwable throwable = tr.getThrowable();
if
(throwable==
null
){
throwable =
new
Throwable();
}
StackTraceElement[] traces = throwable.getStackTrace();
StackTraceElement[] alltrace =
new
StackTraceElement[
0
];
for
(Error e : Assertion.errors) {
StackTraceElement[] errorTraces = e.getStackTrace();
StackTraceElement[] et =
this
.getKeyStackTrace(tr, errorTraces);
StackTraceElement[] message =
new
StackTraceElement[]{
new
StackTraceElement(
"message : "
+e.getMessage()+
" in method : "
, tr.getMethod().getMethodName(), tr.getTestClass().getRealClass().getSimpleName(), index)};
index =
0
;
alltrace =
this
.merge(alltrace, message);
alltrace =
this
.merge(alltrace, et);
}
if
(traces!=
null
){
traces =
this
.getKeyStackTrace(tr, traces);
alltrace =
this
.merge(alltrace, traces);
}
throwable.setStackTrace(alltrace);
tr.setThrowable(throwable);
Assertion.flag =
true
;
Assertion.errors.clear();
tr.setStatus(ITestResult.FAILURE);
}
}
private
StackTraceElement[] getKeyStackTrace(ITestResult tr, StackTraceElement[] stackTraceElements){
List
new
ArrayList
for
(StackTraceElement stackTraceElement : stackTraceElements) {
if
(stackTraceElement.getClassName().equals(tr.getTestClass().getName())){
ets.add(stackTraceElement);
index = stackTraceElement.getLineNumber();
}
}
StackTraceElement[] et =
new
StackTraceElement[ets.size()];
for
(
int
i =
0
; i < et.length; i++) {
et[i] = ets.get(i);
}
return
et;
}
private
StackTraceElement[] merge(StackTraceElement[] traces1, StackTraceElement[] traces2){
StackTraceElement[] ste =
new
StackTraceElement[traces1.length+traces2.length];
for
(
int
i =
0
; i < traces1.length; i++) {
ste[i] = traces1[i];
}
for
(
int
i =
0
; i < traces2.length; i++) {
ste[traces1.length+i] = traces2[i];
}
return
ste;
}
}
|
1
|
|
测试类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
package
com.demo;
import
org.testng.annotations.Listeners;
import
org.testng.annotations.Test;
@Listeners
({com.demo.AssertionListener.
class
})
public
class
Test14 {
@Test
public
void
testAssert3(){
Assertion.verifyEquals(
2
,
3
,
"比较两个数是否相等:"
);
Assertion.verifyEquals(
1
,
2
,
"比较两个数是否相等:"
);
}
@Test
public
void
testAssert4(){
Assertion.verifyEquals(
4
,
3
,
"比较两个数是否相等:"
);
Assertion.verifyEquals(
2
,
2
,
"比较两个数是否相等:"
);
}
}
|