package org.test4j.testng.report;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.testng.ITestContext;
import org.testng.ITestNGMethod;
import org.testng.ITestResult;
import org.testng.TestListenerAdapter;
/**
* 生成测试用例报表<br>
* 格式: <br>
* |user name|success count|failure count|skipped count| <br>
* <br>
* <br>
* |method name|status|duration time|thread id|<br>
*
* @author zili.dengzl
* @author darui.wudr
*
*/
public class UserTestReporter extends TestListenerAdapter {
private final static List<MethodTestDto> methods = new ArrayList<MethodTestDto>();
private final static Map<String, UserGroupDto> userGroups = new HashMap<String, UserGroupDto>();
@Override
public void onTestSuccess(ITestResult result) {
addResult(result, Status.success);
}
@Override
public void onTestFailure(ITestResult result) {
addResult(result, Status.failure);
}
@Override
public void onTestSkipped(ITestResult result) {
addResult(result, Status.skipped);
}
/**
* 生成报表
*/
@Override
public void onFinish(ITestContext testContext) {
ReportPrinter.printHtmlReport(userGroups, methods);
}
private static void addResult(ITestResult result, Status status) {
ITestNGMethod method = result.getMethod();
if (method.isTest() == false) {
return;
}
long duration = result.getEndMillis() - result.getStartMillis();
String[] groups = method.getGroups();
String methodName = method.getMethodName();
String clazzName = method.getRealClass().getName();
methods.add(new MethodTestDto(methodName, clazzName, status, duration, groups));
if (groups == null) {
UserGroupDto userDto = getUserGroupDto(MethodTestDto.UN_GROUP_NAME);
userDto.addResult(status);
return;
}
for (String group : groups) {
UserGroupDto userDto = getUserGroupDto(group);
userDto.addResult(status);
}
}
private static UserGroupDto getUserGroupDto(String group) {
UserGroupDto userDto = userGroups.get(group);
if (userDto == null) {
userDto = new UserGroupDto(group);
userGroups.put(group, userDto);
}
return userDto;
}
public static enum Status {
success {
@Override
public String css() {
return "green";
}
},
failure {
@Override
public String css() {
return "red";
}
},
skipped {
@Override
public String css() {
return "gray";
}
};
public abstract String css();
}
}