package org.nutz;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import junit.framework.TestFailure;
import junit.framework.TestResult;
import org.junit.Test;
import org.junit.runner.Description;
import org.junit.runner.Request;
import org.junit.runner.notification.Failure;
import org.junit.runner.notification.RunListener;
import org.junit.runner.notification.RunNotifier;
import org.nutz.lang.Lang;
import org.nutz.resource.Scans;
/**
* 以多种顺序执行TestCase
* @author wendal
*
*/
public class AdvancedTestAll {
public static void main(String[] args) {
//得到所有带@Test的方法
List<Class<?>> list = Scans.me().scanPackage("org.nutz");
List<Request> reqs = new ArrayList<Request>();
Map<Request, Method> reqMap = new HashMap<Request, Method>();
for (Class<?> clazz : list) {
Method[] methods = clazz.getMethods();
for (Method method : methods) {
if (method.getAnnotation(Test.class) != null) {
Request req = Request.method(clazz, method.getName());
reqs.add(req);
reqMap.put(req , method);
}
}
}
System.out.printf("Found %d Test Class\n", reqs.size());
//先按普通顺序跑一次
TestResult simpleTestResult = test(reqs, "normal", reqMap);
//倒序跑一次
Collections.reverse(reqs);
TestResult reverseTestResult = test(reqs, "reverse", reqMap);
//乱序跑3次
Collections.shuffle(reqs);
TestResult shuffleTestResult_A = test(reqs, "shuffle_A", reqMap);
Collections.shuffle(reqs);
TestResult shuffleTestResult_B = test(reqs, "shuffle_B", reqMap);
Collections.shuffle(reqs);
TestResult shuffleTestResult_C = test(reqs, "shuffle_C", reqMap);
System.out.println("正常顺序------------------------------------------------");
printResult(simpleTestResult);
System.out.println("反序------------------------------------------------");
printResult(reverseTestResult);
System.out.println("乱序A------------------------------------------------");
printResult(shuffleTestResult_A);
System.out.println("乱序B------------------------------------------------");
printResult(shuffleTestResult_B);
System.out.println("乱序C------------------------------------------------");
printResult(shuffleTestResult_C);
System.out.println("-------------------------------------------------------Done");
}
public static TestResult test(List<Request> reqs, String name, Map<Request, Method> reqMap) {
//记录TestCase的顺序,出错时方便查找原因和重现
// TODO 根据order文件还原测试顺序
try {
FileWriter fw = new FileWriter("./test_order_"+name + ".txt");
for (Request request : reqs) {
fw.write(reqMap.get(request).toString());
fw.write("\n");
}
fw.flush();
fw.close();
}
catch (IOException e) {}
final TestResult result = new TestResult();
RunNotifier notifier = new RunNotifier();
notifier.addListener(new RunListener() {
public void testFailure(Failure failure) throws Exception {
result.addError(asTest(failure.getDescription()), failure.getException());
}
public void testFinished(Description description)
throws Exception {
result.endTest(asTest(description));
}
public void testStarted(Description description)
throws Exception {
result.startTest(asTest(description));
}
public junit.framework.Test asTest(Description description) {
return new junit.framework.Test() {
public void run(TestResult result) {
throw Lang.noImplement();
}
public int countTestCases() {
return 1;
}
};
}
});
for (Request request : reqs) {
request.getRunner().run(notifier);
}
return result;
}
public static void printResult(TestResult result) {
System.out.printf("Run %d , Fail %d , Error %d \n", result.runCount(), result.failureCount(), result.errorCount());
if (result.failureCount() > 0) {
Enumeration<TestFailure> enu = result.failures();
while (enu.hasMoreElements()) {
TestFailure testFailure = (TestFailure) enu.nextElement();
System.out.println("--Fail------------------------------------------------");
System.out.println(testFailure.trace());
testFailure.thrownException().printStackTrace(System.out);
}
}
if (result.errorCount() > 0) {
Enumeration<TestFailure> enu = result.errors();
while (enu.hasMoreElements()) {
TestFailure testFailure = (TestFailure) enu.nextElement();
System.out.println("--ERROR------------------------------------------------");
System.out.println(testFailure.trace());
testFailure.thrownException().printStackTrace(System.out);
}
}
}
}