干貨!使用Java注解和反射實現(xiàn)Junit4中的用例調(diào)用(附源碼)
前面我寫了關(guān)于Java注解和反射的文章:
測試開發(fā)必須掌握的重要知識點-Spring的核心知識點 -Java注解@
測試開發(fā)必須掌握的知識點:Java反射
大家可能會問,這些高級的知識點在實際工作中有哪些應用呢?在這里我們來結(jié)合java注解和反射的知識做一個實際案例的編寫,讓大家對其有更深刻的理解!直接上實例!
實例需求
需求:模擬Junit4中的用例結(jié)構(gòu),自定義一個標簽作為測試用例的標識。
在Junit4中注解@Test表示測試用例,每一個測試用例的本質(zhì)就是測試類中的一個方法,即:
- @Test
- public void test() {
- fail("Not yet implemented");
- }
具體要求:
測試類是默認構(gòu)造方法
通過標簽MyTag作為方法是否為用例的標識
作為用例的方法必須是無參的
寫一個方法runCase(String pkgName),使其能夠完成對指定類中測試用例的調(diào)用工作
注解設(shè)計
首先需要定義一個注解MyTag,代碼如下:
- import java.lang.annotation.Retention;
- import java.lang.annotation.Target;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.RetentionPolicy;
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.METHOD)
- public @interface MyTag{
- String name();
- }
測試用例設(shè)計
模擬junit4框架,寫一個測試類,其中l(wèi)ogin、info、logout是無參方法,而test是有參方法
- public class TestTag{
- @MyTag(name="case1")
- public void login(){
- System.out.println("login");
- }
- @MyTag(name="case2")
- public void info(){
- System.out.println("info");
- }
- @MyTag(name="case3")
- public void logout(){
- System.out.println("logout");
- }
- @MyTag(name="case4")
- public void test(String p){
- System.out.println("logout");
- }
- }
運行類的設(shè)計思路
因為測試類是默認構(gòu)造方法,所以使用如下API,完成類實例化
- Class<?> clazz = Class.forName(pkgName)
- Object obj = clazz.newInstance();
因為測試類中有很多方法,我們需要獲取所有的方法并按照規(guī)則進行過濾,代碼如下:
- Method[] methods = clazz.getMethods();
- for (Method method : methods) {
- //過濾規(guī)則
- }
判斷方法的標簽是否為MyTag,代碼如下:
- If(method.getAnnotation(MyTag.class) != null)
判斷方法是否沒有參數(shù),代碼如下:
- If(method.getParameterCount()==0)
運行方法,代碼如下:
- method.invoke(obj)
完整代碼
- public static void runCase(String pkgName) throws IllegalAccessException,IllegalArgumentException, InvocationTargetException, InstantiationException,ClassNotFoundException {
- Class<?> clazz = Class.forName(pkgName);
- Object obj = clazz.newInstance();
- Method[] methods = clazz.getMethods();
- for (Method method : methods) {
- if(method.getAnnotation(MyTag.class) != null&& method.getParameterCount()==0) {
- method.invoke(obj); //調(diào)用方法
- System.out.println("測試用例名稱是:"+method.getName());
- }
- }
- }
運行代碼,輸出如下:
- logout
測試用例名稱是:logout
- login
測試用例名稱是:login
- info
測試用例名稱是:info
這個就是一個模擬Junit4執(zhí)行用例的demo,當我們隨意添加TestTag 中的測試用例時,執(zhí)行runCase方法,都能夠成功執(zhí)行測試用例。相信通過這個例子大家一定會注解,和反射的概念有了更為深刻的理解!我們的實例目前只支持對于指定某一個類中的測試方法進行調(diào)用,大家可以考慮如何實現(xiàn)對于某一個包下所有類的測試用例都可以進行調(diào)用呢?