如何遍歷執行一個包裏面每一個類的用例方法

本人在使用 httpclient 作接口測試的過程當中,用例是以代碼形式寫在一個用例包裏面的,包裏的每一個類表示的一類用例,大體是按照接口所在模塊劃分。這樣就致使了一個問題,執行用例必須得把用例包裏面因此類的用例方法都執行一邊。以前使用過java 的反射來根據類名建立類對象,而後根據方法名執行相應的方法。根據這個思路,加之上網查找了一些相關資料參考了一些其餘人的代碼,本身封裝了一個執行用例包裏面全部類的用例方法的用例執行類,分享出來,供你們參考。java

package source;
 
import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
 
public class excuteSource extends SourceCode {
 
	public static void main(String[] args) {
		excuteAllMethodInPackage("pie.normal");
	}
 
	/**
	 * 執行包內全部類的非 main 方法
	 * 
	 * @param packageName
	 */
	public static void excuteAllMethodInPackage(String packageName) {
		// String packageName = "najm.base";
		List<String> classNames = getClassName(packageName);
		if (classNames != null) {
			for (String className : classNames) {
				String path = packageName + "." + className;
				excuteAllMethod(path);// 執行全部方法
			}
		}
	}
 
	/**
	 * 獲取實例對象的全部 public 方法
	 * 
	 * @param object
	 * @return
	 */
	public static Method[] getAllMethod(Object object) {
		Class<?> class1 = object.getClass();
		class1.getName();
		Method[] methods = class1.getDeclaredMethods();
		// Method[] methods = class1.getMethods();//此處獲取的全部方法,包括繼承來的
		return methods;
	}
 
	/**
	 * 獲取實例對象全部 public 方法,而且執行
	 * 
	 * @param object
	 */
	public static void excuteAllMethod(Object object) {
		Class<?> class1 = object.getClass();
		Method[] methods = class1.getDeclaredMethods();
		for (Method method : methods) {
			if (method.getName().equals("main")) {
				continue;
			}
			executeMethodByName(method.getName(), class1.getName());
		}
	}
 
	/**
	 * 執行一個類的方法內全部的方法,非 main
	 * 
	 * @param path
	 *            類名
	 */
	public static void excuteAllMethod(String path) {
		Class<?> c = null;
		Object object = null;
		try {
			c = Class.forName(path);
			object = c.newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
		Class<?> class1 = object.getClass();
		Method[] methods = class1.getDeclaredMethods();
		for (Method method : methods) {
			if (method.getName().equals("main")) {// 排除 mian 方法
				continue;
			}
			executeMethodByName(method.getName(), class1.getName());
		}
	}
 
	/**
	 * 根據方法名執行相應方法,利用反射,適用於帶參方法
	 * 
	 * @param api_name
	 *            接口名稱
	 * @param use
	 *            傳入參數,此處爲適配新的請求方法
	 * @return 返回請求json數據
	 */
	public static void executeMethodByName(String mehtod, String path) {
		Object obj = null;
		Method method = null;
		String className = null;
		try {
			// 裏面寫本身的類名及路徑
			Class<?> c = Class.forName(path);
			obj = c.newInstance();
			className = c.getCanonicalName();
			// 第一個參數寫的是方法名,第二個\第三個\...寫的是方法參數列表中參數的類型
			method = c.getMethod(mehtod);
			// invoke是執行該方法,並攜帶參數值
		} catch (Exception e) {
			output("反射執行出錯!", e);
		}
		try {
			output("執行" + className + "類的" + method.getName() + "方法");
			method.invoke(obj);
		} catch (Exception e) {
			output("反射運行方法異常!", e);
		}
	}
 
	/**
	 * 獲取某包下全部類
	 * 
	 * @param packageName
	 *            包名
	 * @param childPackage
	 *            是否遍歷子包
	 * @return 類的完整名稱
	 */
	public static List<String> getClassName(String packageName) {
		List<String> fileNames = new ArrayList<>();
		ClassLoader loader = Thread.currentThread().getContextClassLoader();// 獲取當前位置
		String packagePath = packageName.replace(".", "/");// 轉化路徑,Linux 系統
		URL url = loader.getResource(packagePath);// 具體路徑
		if (url == null || !"file".equals(url.getProtocol())) {
			output("獲取類名失敗!");
			return fileNames;
		}
		File file = new File(url.getPath());
		File[] childFiles = file.listFiles();
		for (File childFile : childFiles) {
			String path = childFile.getPath();
			if (path.endsWith(".class")) {
				path = path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf("."));
				fileNames.add(path);
			}
		}
		return fileNames;
	}
}

main 方法裏面寫的就是使用方法,這裏須要提醒一點,必定要對方法名進行過濾,否則可能會把其餘類的 main 方法也執行了。編程

往期文章精選

  1. java一行代碼打印心形
  2. Linux性能監控軟件netdata中文漢化版
  3. 接口測試代碼覆蓋率(jacoco)方案分享
  4. 性能測試框架
  5. 如何在Linux命令行界面愉快進行性能測試
  6. 圖解HTTP腦圖
  7. 寫給全部人的編程思惟
  8. 測試之JVM命令腦圖
  9. 將json數據格式化輸出到控制檯
  10. 如何測試機率型業務接口
  11. 「雙花」BUG的測試分享
  12. 將swagger文檔自動變成測試代碼

公衆號地圖 ☢️ 一塊兒來~FunTester

相關文章
相關標籤/搜索