suite含义:
junit里可以通过test suite灵活的组织测试用例,比如:
存在测试类A,其中有3个测试方法a1 a2 a3;
测试类B,其中有2个测试方法b1 b2;
测试类C,其中有2个测试方法c1 c2。
现在我执行运行测试类A,测试类B,和测试类C中的方法c1,这个时候test suite就派上用场了。
junit3(3.8.2)中的实现:
Eclipse中在类名出右键,选择执行junit,可以看到用例执行情况如我们预期一致。
junit4(4.12)中的实现:
juint4中有@RunWith(Suite.class) 和 @Suite.SuiteClasses({A.class, B.class}) 聚合类A和B;但是不能指定某些方法。
执行指定测试类中的指定方法
如果我们想执行某个类中的某些方法怎么处理呢?下面给出一种解决思路:
1、定义如下注解:
Class<?>[] className 类名
int[] methodsNumPerClass(); 每个类对应的方法数量
String[] methodsName() 方法名
@Retention(RetentionPolicy.RUNTIME)
@Target({java.lang.annotation.ElementType.TYPE})
public @interface SuiteClassesMethods {
public Class<?>[] className();
public int[] methodsNumPerClass();
public String[] methodsName();
}
2、使用举例,例如我们想执行A中的a1,a2和B中的b2
package com.zjg.junit.junit4SuiteClassesMethods;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.junit.runner.JUnitCore;
import org.junit.runner.Request;
import org.junit.runner.Result;
import com.zjg.junit.junit4suite.A;
import com.zjg.junit.junit4suite.B;
@SuiteClassesMethods(className = { A.class,B.class },
methodsNumPerClass = { 2, 1 },
methodsName = {"testa1","testa2","testb2"})
public class Test3 {
public static void main(String[] args) throws Exception {
Class<Test3> clazz = Test3.class;
SuiteClassesMethods scm = clazz.getAnnotation(SuiteClassesMethods.class);
Class<?>[] className = scm.className();
int[] methodsNumPerClass = scm.methodsNumPerClass();
String[] methodsName = scm.methodsName();
// 根据注解 传的方法,与每个测试类对应
Map<Class<?>, List<String>> myClassMethodMap = new LinkedHashMap<Class<?>, List<String>>();
List<List<String>> listMethodsName = new ArrayList<List<String>>();
// k游标,遍历methodsName
int k = 0;
// 外层for循环,表示类个数
for (int i = 0; i < className.length; i++) {
List<String> temp = new ArrayList<String>();
// 内层for循环,为每个类赋方法
for (int m = 0; m < methodsNumPerClass[i]; m++) {
temp.add(methodsName[k]);
k++;
}
listMethodsName.add(i, temp);
myClassMethodMap.put(className[i], listMethodsName.get(i));
}
JUnitCore junitRunner = new JUnitCore();
List<Result> methodsResult = new ArrayList<Result>();
// 运行测试方法
for(Map.Entry<Class<?>, List<String>> entry : myClassMethodMap.entrySet()){
Class<?> testClass = entry.getKey();
List<String> failMethod = entry.getValue();
for(int i = 0; i < failMethod.size(); i++){
Request request = Request.method(testClass, failMethod.get(i));
Result result = junitRunner.run(request);
methodsResult.add(result);
}
}
try{
for(int j = 0; j < methodsResult.size(); j++){
String resultDesc = methodsResult.get(j).getFailures().toString();
System.out.println(resultDesc);
}
}catch(Exception e){
e.printStackTrace();
}
}
}
参考:http://blog.csdn.net/neven7/article/details/42361297