介面自動化之引數動態生成替換
介面自動化框架設計之時間型別引數動態生成
如題,在介面測試過程中,某些介面提交引數可能是不同格式的當前時間、或者未來時間,如下圖
這個介面引數需要提交當前格林威治時間
該介面引數需要提交當前標準時間、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;
}
介面用例設計中,動態引數用${關鍵字}形式
這樣就完成了介面框架最重要的一部分:引數動態生成替換的設計
相關文章
- 自動生成介面各種逆向組合引數
- 效能優化 (八) APK 加固之動態替換 Application優化APKAPP
- 【python介面自動化】- 正則用例引數化Python
- url 帶引數的介面怎樣自動化
- vue-router如何實時地址不變,動態替換路由引數(位址列引數)Vue路由
- 介面自動化之介面整理(抓包)
- 【OracleSQL】常用自動替換總結OracleSQL
- Jmeter 介面自動化連載 (13) - 自動生成測試報告JMeter測試報告
- 自動生成介面文件coreapiAPI
- DRF 自動生成介面文件
- Jenkins實戰之動態替換Android應用圖示JenkinsAndroid
- 介面測試--獲取動態引數進階
- 介面自動化使用requests生成測試報告測試報告
- 介面自動化實戰之框架搭建框架
- python+pytest介面自動化(6)-請求引數格式的確定Python
- 介面自動化與ui自動化區別UI
- Httpclient 介面自動化HTTPclient
- python 介面自動化Python
- 全自動化介面
- 動態路由(URL引數)路由
- python介面自動化(三十四)-封裝與呼叫--函式和引數化(詳解)Python封裝函式
- Mybatis(一)Porxy動態代理和sql解析替換MyBatisSQL
- python介面自動化測試之介面資料依賴Python
- 介面自動化測試
- .NET正則替換URL引數值
- bash 引數替換中的模式匹配模式
- canvas實現動態替換人物的背景顏色Canvas
- 自動的自動化:EvoSuite 自動生成JUnit的測試用例UI
- 介面自動化 是 pytest 結合 allure 生成報告問題
- JMeter 介面自動化測試(手工轉自動化指令碼)JMeter指令碼
- Python函式/動態引數/關鍵字引數Python函式
- Python 介面自動化測試Python
- Laravel-apidoc-generator 無法自動生成帶引數的 API 文件LaravelAPI
- 用javascript替換URL中的引數值JavaScript
- Python 介面自動化如果介面的引數很多 (30-50 個左右) 大家都是怎麼來管理的?Python
- Django(74)drf-spectacular自動生成介面文件Django
- [Django REST framework - 自動生成介面文件、分頁]DjangoRESTFramework
- vue自定義表單生成器,可根據json引數動態生成表單VueJSON