介面自動化之引數動態生成替換

孤獨一派發表於2020-07-04

介面自動化框架設計之時間型別引數動態生成

如題,在介面測試過程中,某些介面提交引數可能是不同格式的當前時間、或者未來時間,如下圖

這個介面引數需要提交當前格林威治時間

該介面引數需要提交當前標準時間、n天后的標準時間

介面自動化框架的設計中,為了保證介面用例能重複執行,需要動態生成提交的時間型別引數,具體設計如下:

第一步:設計一個日期時間工具類CalendarUtil,用於生成各種需要提交的時間格式:

public class CalendarUtil {

/**
* 獲取指定格式的當前標準時間
*
* @param format
* @return
*/

public static String getCurrentGeneralTime(String format) {
SimpleDateFormat sdf = new SimpleDateFormat(format);
Date date = new Date();
return sdf.format(date);
}

/**
* 獲取n天前或n天后指定格式的標準時間
*
* @param format
* @return
*/

public static String getGeneralTimeAfter(int date,String format) {
Calendar c = Calendar.getInstance();
c.add(Calendar.DATE, date);
SimpleDateFormat sdf = new SimpleDateFormat(format);
return sdf.format(c.getTime());
}

/**
* 獲取當前格林威治時間
*
* @return
*/

public static String getCurrentGreenTime() {
Calendar c = new GregorianCalendar();
c.add(Calendar.HOUR_OF_DAY, -8);
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.000'Z'");
return df.format(c.getTime());
}


/**
* 獲取date天前或date天后的起始格林時間
*
* @param date
* @return
*/

public static String getGreenTimeAfterDate(int date) {
Calendar c = new GregorianCalendar();
c.add(Calendar.DATE, date-1);
c.set(Calendar.HOUR_OF_DAY, 16);
c.set(Calendar.MINUTE, 00);
c.set(Calendar.SECOND, 00);
c.set(Calendar.MILLISECOND, 000);
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.000'Z'");
return df.format(c.getTime());
}

/**
* 獲取當前時間戳
*
* @return
*/

public static Long getCurrentTimeStamp() {
Date date = new Date();
return date.getTime();
}


/**
* 獲取date天前或date天后的時間戳
*
* @param date
* @return
*/

public static Long getTimeStampAfterDate(int date) {
Calendar c = Calendar.getInstance();
c.add(Calendar.DATE, date);
c.add(Calendar.HOUR_OF_DAY, 00);
c.add(Calendar.MINUTE, 00);
c.add(Calendar.SECOND, 00);
c.add(Calendar.MILLISECOND, 000);
return c.getTime().getTime();
}
}

第二步:獲取用例資料後檢測提交引數中是否包含對應的關鍵字,然後用生成的方法進行替換提交值,如下:

/**
* 替換請求引數中的${xxx}
*
* @param requestParams
* @return
*/

public String replaceRequestParams(String requestParams) {

// 請求引數不為空且包含替換標識
if (StringUtils.isNotEmpty(requestParams) && requestParams.contains("${")) {
String regex = "\\$\\{(.*?)}";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(requestParams);
while (matcher.find()) {
String finder = matcher.group(1);
String result = finder.trim();
if (result.equals("currentGreenTime")) {
// 替換成當前格林時間
requestParams = requestParams.replaceAll("\\$\\{" + finder + "}",
CalendarUtil.getCurrentGreenTime());
} else if (result.contains("greenTimeAfterDate(")) {
// 替換成n天前或者n天后的格林威治時間
int date = Integer.parseInt(result.substring(result.indexOf("(") + 1, result.indexOf("")).trim());
finder = finder.replaceAll("\\(", "\\\\(").replaceAll("\\)", "\\\\)");
requestParams = requestParams.replaceAll("\\$\\{" + finder + "}",
CalendarUtil.getGreenTimeAfterDate(date));
} else if (result.contains("currentTimeStamp")) {
// 替換成當前時間戳
requestParams = requestParams.replaceAll("\\$\\{" + finder + "}",
CalendarUtil.getCurrentTimeStamp().toString());
} else if (result.contains("timeStampAfterDate(")) {
// 替換成n天前或n天后的時間戳
int date = Integer.parseInt(result.substring(result.indexOf("(") + 1, result.indexOf("")).trim());
finder = finder.replaceAll("\\(", "\\\\(").replaceAll("\\)", "\\\\)");
requestParams = requestParams.replaceAll("\\$\\{" + finder + "}",
CalendarUtil.getTimeStampAfterDate(date).toString());
} else if (result.contains("currentGeneralTime")) {
// 替換生成的指定格式的當前標準時間
String regex2 = "currentGeneralTime,(.*?)";
Pattern p = Pattern.compile(regex2);
Matcher m = p.matcher(result);
while (m.find()) {
String format = m.group(1);
requestParams = requestParams.replaceAll("\\$\\{" + finder + "}",
CalendarUtil.getCurrentGeneralTime(format));
}
} else if (result.contains("generalTimeAfter")) {
// 替換生成n天前或n天后指定格式的標準時間
int date = Integer.parseInt(result.substring(result.indexOf("(")+1, result.indexOf(")")));
finder = finder.replaceAll("\\(", "\\\\(").replaceAll("\\)", "\\\\)");
String format2 = result.substring(result.indexOf(",")+1);
requestParams = requestParams.replaceAll("\\$\\{" + finder + "}",
CalendarUtil.getCurrentGeneralTime(format2));
} else {
Object replacement;
// 判斷map裡有沒有儲存對應的變數
if (map.containsKey(result)) {
replacement = map.get(result);
// 如果有存變數,但值是空,當空字串處理
if (null == replacement) {
replacement = "";
}
} else {
// 跳過用例執行,丟擲skipException
throw new SkipException(result + "不存在,替換失敗");
}
requestParams = requestParams.replaceAll("\\${" + finder + "}", replacement.toString());
}
}
}
return requestParams;
}

介面用例設計中,動態引數用${關鍵字}形式

這樣就完成了介面框架最重要的一部分:引數動態生成替換的設計

相關文章