junit中test suite的用法

suite含义:

image

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)中的实现:

image

image

image

image

Eclipse中在类名出右键,选择执行junit,可以看到用例执行情况如我们预期一致。

junit4(4.12)中的实现:

image

image

image

image

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

转载于:https://my.oschina.net/zjg23/blog/1492913

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值