最近出現一個問題,介面入參欄位過多(介面傳入200多個欄位),導致人工測驗執行出現沒有耐心一個一個測驗欄位,從而引發幾個欄位非空校驗出了問題,
解決方案目的:引入迭代器,解決當介面欄位引數過多的時候,介面欄位引數測驗容易被忽略的情況,
解決方案適應的介面入參格式:有如圖所示的復雜度和層級的介面格式都可以直接使用,不限制引數個數,head測驗環境一般是寫死不校驗,主要校驗邏輯都是在body里面,

解決方案思路:
1.判斷第一個層級是否是body,
2.選擇增強for回圈遍歷還是選擇for回圈遍歷,還是選擇迭代器遍歷,
3.第二層為list的下層只考慮了map,沒考慮第三層為list和鍵值對的情況,主要是目前沒碰到這樣的介面設計,
彩蛋:
修改的值可以采用列舉的方式傳入到執行的方法里面去,作業中是這樣,分享的這個沒寫,
手動介面測驗效率大幅度提升,每個介面測驗傳空如果需要1分鐘,200個引數,測驗一次為空的場景,需要1*200分鐘,再測驗欄位為特殊字符,欄位長度,欄位格式,欄位,,,,參考這個,實際只需要幾分鐘全部跑完所有場景,而且每次上線之前都可以全量回歸,太香了
package test;
import org.testng.annotations.Test;
import java.text.SimpleDateFormat;
import java.util.*;
public class iteratorTestDemo {
/**
* 續要測驗的已經組裝好的報文引數
* */
public Map<String, Object> test_0001(){
System.out.println("1");
return new HashMap<>();
}
/**
* 需要執行的測驗方法---執行這個就行
* */
@Test
public iteratorTestDemo() throws Exception {
TestT(test_0001(),"修改后的value值"); //二審
}
// String value_T ="修改后的value值"; //需要測修改的值,欄位為空,欄位為特殊字符,欄位長度,欄位型別等等,
/**
* 注意:a.封裝成公共方法,后面任意介面都可以直接呼叫,當做入參傳入即可
* b.需要提前組裝好的入參報文,并且初始化有正確的值
* @param paramMap value_T
* @throws Exception
*/
public void TestT(Map<String, Object> paramMap,String value_T) throws Exception { //組裝map,提供遍歷之后的map,每次修改一個入參
//第一層
// for (Map.Entry entry_1 : paramMap.entrySet()) { //遍歷map里面的鍵值對 for-each增強for回圈
Iterator heaBodyMap_iterator = paramMap.entrySet().iterator();
while (heaBodyMap_iterator.hasNext()) {
Map.Entry heaBodyMap_entry = (Map.Entry) heaBodyMap_iterator.next();
Object heaBodyMap_key = heaBodyMap_entry.getKey(); //獲取到key,
Object heaBodyMap_value = heaBodyMap_entry.getValue();//獲取到value
Object heaBodyMap_value2 = heaBodyMap_value; //先保存初始化的value值,然后后面再賦值回去
//第二層
if (heaBodyMap_key == "head") {
System.out.println("請求頭部寫死,不需要測驗");
}
if (heaBodyMap_key == "body") { //多層map--body
if (heaBodyMap_value instanceof Map) {
Map<String, Object> heaBodyMap_value_map = (Map<String, Object>) heaBodyMap_value; //強制轉換成map
//不可用用for回圈
Iterator bodyLevel_iterator = heaBodyMap_value_map.entrySet().iterator();
while (bodyLevel_iterator.hasNext()) {
Map.Entry bodyLevel_entry = (Map.Entry) bodyLevel_iterator.next();
Object bodyLevel_key = bodyLevel_entry.getKey(); //獲取到key
Object bodyLevel_value = bodyLevel_entry.getValue();//獲取到value
Object bodyLevel_value2 = bodyLevel_value; //先保存初始化的value值,然后后面再賦值回去
heaBodyMap_value_map.put((String) bodyLevel_key, value_T);
//組裝報文發起請求-斷言結果放這里,然后斷言之后再把報文初始化
//恢復最初的map
heaBodyMap_value_map.put((String) bodyLevel_key, bodyLevel_value2); //再恢復初始化的第二層map
paramMap.put((String) heaBodyMap_key, heaBodyMap_value_map);//再恢復初始化的第一層map
// System.out.println("+++++++++++第一層恢復之后的paramMap::::::: " + paramMap);
//第三層--是map
if (bodyLevel_value instanceof Map) { //如果第二層是map,遍歷map
Map<String, Object> bodyLevel_value_map = (Map<String, Object>) bodyLevel_value;
//回圈第三層
Iterator threeLevelForMap_iterator = bodyLevel_value_map.entrySet().iterator();
while (threeLevelForMap_iterator.hasNext()) {
Map.Entry threeLevelForMap_entry = (Map.Entry) threeLevelForMap_iterator.next();
Object threeLevelForMap_key = threeLevelForMap_entry.getKey(); //獲取到key,
Object threeLevelForMap_value = threeLevelForMap_entry.getValue();//獲取到value
Object threeLevelForMap_value2 = threeLevelForMap_value; //先保存初始化的value值,然后后面再賦值回去
//組裝報文發起請求-斷言結果放這里,然后斷言之后再把報文初始化
//復原原始map
bodyLevel_value_map.put((String) threeLevelForMap_key, threeLevelForMap_value2);
paramMap.put((String) heaBodyMap_key, heaBodyMap_value_map);//把重新組裝第一層的map,將第二層的map修改完之后放入
// System.out.println("+++++++++++第一層恢復之后的paramMap::::::: " + paramMap);
if (threeLevelForMap_value instanceof Map){ //第三層的value是map,第四層也是map
Map<String, Object> threeLevelForMap_map = (Map<String, Object>) threeLevelForMap_value;
//回圈第四層--map
Iterator fourLevelForMap_1_iterator = threeLevelForMap_map.entrySet().iterator();
while (fourLevelForMap_1_iterator.hasNext()) {
Map.Entry fourLevelForMap_1_entry = (Map.Entry) fourLevelForMap_1_iterator.next();//便利每一個鍵值對
Object fourLevelForMap_1_key = fourLevelForMap_1_entry.getKey();
Object fourLevelForMap_1_value = fourLevelForMap_1_entry.getValue();
Object fourLevelForMap_1_value2 = fourLevelForMap_1_value;
threeLevelForMap_map.put((String) fourLevelForMap_1_key,value_T);
paramMap.put((String) heaBodyMap_key, heaBodyMap_value_map);//把重新組裝第一層的map,將第二層的map修改完之后放入
//組裝報文發起請求-斷言結果放這里,然后斷言之后再把報文初始化
//復原原始map
threeLevelForMap_map.put((String) fourLevelForMap_1_key,fourLevelForMap_1_value2);
paramMap.put((String) heaBodyMap_key, heaBodyMap_value_map);//把重新組裝第一層的map,將第二層的map修改完之后放入
// System.out.println("+++++++++++第一層恢復之后的paramMap::::::: " + paramMap);
}
}
if (threeLevelForMap_value instanceof List){ //第三層的value是map,第四層是list
List<Map<String,Object>> threeLevelForMap_list = (List)threeLevelForMap_value; //
//迭代
Iterator<Map<String,Object>> fourLevelForMap_2_iterator = threeLevelForMap_list.iterator();
while (fourLevelForMap_2_iterator.hasNext()){
Map<String,Object> fiveLevelForMap_2_map = fourLevelForMap_2_iterator.next();//把便利的list,轉化成map
Iterator fiveLevelForMap_2_iterator = fiveLevelForMap_2_map.entrySet().iterator();//便利list里面的每一個鍵值對
while (fiveLevelForMap_2_iterator.hasNext()){
Map.Entry fiveLevelForMap_2_entry = (Map.Entry) fiveLevelForMap_2_iterator.next();//獲取鍵值對
Object fiveLevelForMap_2_key = fiveLevelForMap_2_entry.getKey();
Object fiveLevelForMap_2_value = fiveLevelForMap_2_entry.getValue();
Object fiveLevelForMap_2_value2 = fiveLevelForMap_2_value;
fiveLevelForMap_2_map.put((String) fiveLevelForMap_2_key,value_T);
paramMap.put((String) heaBodyMap_key, heaBodyMap_value_map);//把重新組裝第一層的map,將第二層的map修改完之后放入
//組裝報文發起請求-斷言結果放這里,然后斷言之后再把報文初始化
//復原原始map
fiveLevelForMap_2_map.put((String) fiveLevelForMap_2_key,fiveLevelForMap_2_value2);
paramMap.put((String) heaBodyMap_key, heaBodyMap_value_map);//
// System.out.println("+++++++++++第一層恢復之后的paramMap::::::: " + paramMap);
}
}
}
}
}
//第三層--是list
if (bodyLevel_value instanceof List) {
List<Map<String, Object>> bodyLevel_value_list = (List) bodyLevel_value;//如果第三層是list,遍歷list
//迭代
Iterator<Map<String, Object>> threeLevelForList_iterator = bodyLevel_value_list.iterator();
while (threeLevelForList_iterator.hasNext()) {
Map<String, Object> threeLevelForList_map = threeLevelForList_iterator.next();//把遍歷的list內部,如果還有一層,就轉換成map
//第四層--是map---
//迭代
Iterator fourLevelForMap_iterator = threeLevelForList_map.entrySet().iterator();
while (fourLevelForMap_iterator.hasNext()) {
Map.Entry fourLevelForMap_entry = (Map.Entry) fourLevelForMap_iterator.next();
Object fourLevelForMap_key = fourLevelForMap_entry.getKey(); //獲取到key,
Object fourLevelForMap_value = fourLevelForMap_entry.getValue();//獲取到value
Object fourLevelForMap_value2 = fourLevelForMap_value; //先保存初始化的value值,然后后面再賦值回去
threeLevelForList_map.put((String) fourLevelForMap_key, value_T);
paramMap.put((String) heaBodyMap_key, heaBodyMap_value_map);//再恢復初始化的第一層map
//組裝報文發起請求-斷言結果放這里,然后斷言之后再把報文初始化
//復原原始map
threeLevelForList_map.put((String) fourLevelForMap_key, fourLevelForMap_value2);//再恢復初始化的第四層map-----沒有再更新第三層的list串列,因為list里面是參考的map,參考的參考的參考的,重要的事情說三遍
paramMap.put((String) heaBodyMap_key, heaBodyMap_value_map);//再恢復初始化的第一層map
// System.out.println("+++++++++++第一層恢復之后的paramMap::::::: " + paramMap);
//第五層
if (fourLevelForMap_value instanceof Map) {
//第五層map---
Map<String, Object> fiveLevelForMap_map = (Map) fourLevelForMap_value;//把第四層的map-value賦值給第五層map
//迭代
Iterator fiveLevelForMap_iterator = fiveLevelForMap_map.entrySet().iterator();
while (fiveLevelForMap_iterator.hasNext()) {
Map.Entry fiveLevelForMap_entry = (Map.Entry) fiveLevelForMap_iterator.next();
Object fiveLevelForMap_key = fiveLevelForMap_entry.getKey(); //獲取到key, fiveLevelForMap_key
Object fiveLevelForMap_value = fiveLevelForMap_entry.getValue();//獲取到value
Object fiveLevelForMap_value2 = fiveLevelForMap_value; //先保存初始化的value值,然后后面再賦值回去
fiveLevelForMap_map.put((String) fiveLevelForMap_key, value_T);
paramMap.put((String) heaBodyMap_key, heaBodyMap_value_map);//再恢復初始化的第一層map
//組裝報文發起請求-斷言結果放這里,然后斷言之后再把報文初始化
//復原原始map
fiveLevelForMap_map.put((String) fiveLevelForMap_key, fiveLevelForMap_value2);
paramMap.put((String) heaBodyMap_key, heaBodyMap_value_map);//再恢復初始化的第一層map
// System.out.println("+++++++++++第一層恢復之后的paramMap::::::: " + paramMap);
}
}
}
}
}
}
}
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/293933.html
標籤:其他
上一篇:testNG分組執行的時候報錯depends on nonexistent method “xxxx.xxxxx“
