以前写多接口场景用例的时候,基本上一个测试类里只包含我的接口用例要调用的方法,如果有需要调用其他方法都是写到通用里。本次我尝试把我的接口用例要调用的其他的解析的方法也写在我的测试类里,感觉看起来也挺舒服的。 关于接口自动化前面已经提到了很多很多,今天想记录这一篇是因为原本我可以敷衍地写完我的用例的,但是我还是认真思考了。感觉自己棒棒哒! 接口背景 saveZnfy保存婴幼儿照护费用 queryZxfjkcZnfyXq查询婴幼儿照护费用详情 deleteZnfy作废婴幼儿照护费用 看这三个接口,我想也知道我今天要写的场景是啥了吧?没错! 保存婴幼儿照护费用查询婴幼儿照护费用详情作废婴幼儿照护费用。 数据关系 保存婴幼儿照护费用,返回CJLSH和CJXH; 拿着CJLSH和CJXH可以查询婴幼儿照护费用详情,且返回婴幼儿照护费用相关信息; 拿着婴幼儿照护费用相关信息可以作废该条婴幼儿照护费用。 接口代码 保存婴幼儿照护费用查询婴幼儿照护费用详情作废婴幼儿照护费用。 packagecom。XXXXXXX。api。XX。XXX。XXX。XXXXX; importcom。alibaba。fastjson。JSON; importcom。alibaba。fastjson。JSONException; importcom。alibaba。fastjson。JSONObject; importcom。XXXXXXX。basedata。DataBaseName; importcom。XXXXXXX。basedata。GroupName; importcom。XXXXXXX。common。ApiResponse; importcom。XXXXXXX。common。EtaxHttpRequest; importcom。XXX。api。util。AssertUtil; importcom。XXX。api。util。JdbcUtil; importjavafx。util。Pair; importorg。springframework。http。HttpMethod; importorg。testng。annotations。Test; importru。yandex。qatools。allure。annotations。Title; importjava。util。ArrayList; importjava。util。List; importjava。util。Set; importstaticorg。testng。AssertJUnit。assertEquals; createbylxl01on20211211 Title(婴幼儿照护费用多接口保存、查询、作废场景用例) publicclassSaveZnfyAndQueryZxfjkcZnfyXqAndDeleteZnfyTestextendsEtaxHttpRequest{ Test(dataProviderexcel,groups{GroupName。WEBSB}) publicvoidtestSaveZnfyAndQueryZxfjkcZnfyXqAndDeleteZnfy(Stringrun,StringtestName,Stringyhm,Stringdata,StringbeforeSql,StringexpectData,Stringdevice){ 执行前置sql,删除已采集的数据 JdbcUtil。jdbcBatchUpdate(jdbcTemplateDynamic(DataBaseName。SB),beforeSql); 定义婴幼儿照护费用的保存接口 StringSaveZnfyApiwebsbhlwyhzxfjkcsaveZnfy; 执行婴幼儿照护费用保存接口 ApiResponseSaveZnfyApiresposerequestHlw(SaveZnfyApi,HttpMethod。POST,JSON。parseObject(data),yhm,device); 打印婴幼儿照护费用保存接口的返回数据 System。out。println(SaveZnfyApirespose); 从婴幼儿照护费用保存接口的返回数据里提取查询婴幼儿照护详情页所需要的参数 Stringcxxx(String)((JSONObject)SaveZnfyApirespose。getData())。get(cjlsh); Stringcxxx2(String)((JSONObject)SaveZnfyApirespose。getData())。get(cjxh); 重写查询婴幼儿照护详情页的入参代码 StringQueryZxfjkcZnfyXqData{zxfjkclxDm:0207,cjlsh:cxxx,cjxh:cxxx2,sbkcnd:2021}; 打印婴幼儿照护费用详情页的入参 System。out。println(QueryZxfjkcZnfyXqDatais!!!???:QueryZxfjkcZnfyXqData); 定义婴幼儿照护费用详情页的接口 StringQueryZxfjkcZnfyXqApiwebsbhlwyhzxfjkcqueryZxfjkcZnfyXq; 执行婴幼儿照护费用详情页的接口 ApiResponseres2requestHlw(QueryZxfjkcZnfyXqApi,HttpMethod。POST,JSON。parseObject(QueryZxfjkcZnfyXqData),yhm,device); 取出婴幼儿照护费用详情页的接口的返回 System。out。println(res2is!!!???:res2); 从婴幼儿照护详情页的接口的返回数据里提取作废婴幼儿照护所需要的参数 StringtyxxfindJsonElement(JSONObject。toJSONString(res2),tyxx); StringznfyzcfindJsonElement(JSONObject。toJSONString(res2),znfyzc); 重写作废婴幼儿照护的入参代码 StringdeleteZnfyDatanewStringBuffer({) 。append()。append(bglxDm)。append()。append(:)。append()。append(2)。append()。append(,) 。append()。append(znfyzc)。append()。append(:)。append(znfyzc)。append(})。toString(); 打印作废婴幼儿照护的入参 System。out。println(deleteZnfyDatais:deleteZnfyData); 定义作废婴幼儿照护的接口 StringdeleteZnfyApiwebsbhlwyhzxfjkcdeleteZnfy; 执行作废婴幼儿照护的接口 ApiResponseres3requestHlw(deleteZnfyApi,HttpMethod。POST,JSON。parseObject(deleteZnfyData),yhm,device); StringbodyJSON。toJSONString(res3。getCode()); assertEquals(expectData,body); } 根据字段获取json对应的value内容返回字符串适用于对象嵌套对象 paramjson paramfindEle return publicstaticStringfindJsonElement(Stringjson,StringfindEle){ ListPairString,StringfieldsnewArrayList(); JSONObjectjsonObjectnull; try{ jsonObjectJSON。parseObject(json); }catch(JSONExceptione){ return解析异常; } parse(jsonObject,fields); for(PairString,Stringfield:fields){ if(field。getKey()。equalsIgnoreCase(findEle)){ returnfield。getValue(); } } return不存在; } 递归解析 paramobj paramfields publicstaticvoidparse(JSONObjectobj,ListPairString,Stringfields){ Setstringsobj。keySet(); for(Stringstring:strings){ Objectoobj。get(string); if(onull){ continue; } PairString,StringstringStringPairnewPair(string,o。toString()); fields。add(stringStringPair); if(o。getClass()。getName()。equals(com。alibaba。fastjson。JSONObject)){ parse((JSONObject)o,fields); } } } } 我的亮点 作废婴幼儿照护费用是亮点。 首先,保存婴幼儿照护费用查询婴幼儿照护费用详情这一段是很简单的。 定义婴幼儿照护费用的保存接口 StringSaveZnfyApiwebsbhlwyhzxfjkcsaveZnfy; 执行婴幼儿照护费用保存接口 ApiResponseSaveZnfyApiresposerequestHlw(SaveZnfyApi,HttpMethod。POST,JSON。parseObject(data),yhm,device); 打印婴幼儿照护费用保存接口的返回数据 System。out。println(SaveZnfyApirespose); 从婴幼儿照护费用保存接口的返回数据里提取查询婴幼儿照护详情页所需要的参数 Stringcxxx(String)((JSONObject)SaveZnfyApirespose。getData())。get(cjlsh); Stringcxxx2(String)((JSONObject)SaveZnfyApirespose。getData())。get(cjxh); 重写查询婴幼儿照护详情页的入参代码 StringQueryZxfjkcZnfyXqData{zxfjkclxDm:0207,cjlsh:cxxx,cjxh:cxxx2,sbkcnd:2021}; 打印婴幼儿照护费用详情页的入参 System。out。println(QueryZxfjkcZnfyXqDatais!!!???:QueryZxfjkcZnfyXqData); 定义婴幼儿照护费用详情页的接口 StringQueryZxfjkcZnfyXqApiwebsbhlwyhzxfjkcqueryZxfjkcZnfyXq; 执行婴幼儿照护费用详情页的接口 ApiResponseres2requestHlw(QueryZxfjkcZnfyXqApi,HttpMethod。POST,JSON。parseObject(QueryZxfjkcZnfyXqData),yhm,device); 但是作废婴幼儿照护费用这一段就没有那么好玩了,我们来看下作废婴幼儿照护费用所需要的参数: { bglxDm:2, tyxx:{ nsrxm:null, nsrsjhm:1879200, nsrdzyx:, nsrtxdz:不告诉你, nsrpoxm:null, nsrposfzjlxDm:null, nsrposfzjlxmc:null, nsrposfzjhm:null, nsrsf:null }, znfyzc:{ cjlsh:1000000007203722, cjxh:1000000006605854, kjywrlbDm:null, kjywrdah:, sbkcnd:2021, kcyxqq:1638288000000, kcyxqz:1640880000000, cjrq:1640102400000, cjrlxDm:01, yxbz:Y, kjywrmc:, zzbjDm:null, zzbjmc:null, jyqdDm:11, kzztDm:null, nsrsjhm:1879200, nsrdzyx:, nsrtxdz:不告诉你, zndah:null, jtcyxh:5000006, xm:哈哈, sfzjlxDm:291, sfzjhm:L1, gjhdqszDm:156, gjhdqszmc:中华人民共和国, csrq:20211220, fpbl:100, cfjlzt:0, ynsrgxDm:2 } } 这个接口的参数很常见,如果我们直接把这个参数放到表格里,接口调用直接JSON。parseObject(Data)就能解析出来,但是我现在要从上一个接口(查询婴幼儿照护费用详情页)返回并解析给下一个接口(作废婴幼儿照护费用)当入参,所以写了一个解析的方法,如下: 根据字段获取json对应的value内容返回字符串适用于对象嵌套对象 paramjson paramfindEle return publicstaticStringfindJsonElement(Stringjson,StringfindEle){ ListPairString,StringfieldsnewArrayList(); JSONObjectjsonObjectnull; try{ jsonObjectJSON。parseObject(json); }catch(JSONExceptione){ return解析异常; } parse(jsonObject,fields); for(PairString,Stringfield:fields){ if(field。getKey()。equalsIgnoreCase(findEle)){ returnfield。getValue(); } } return不存在; } 递归解析 paramobj paramfields publicstaticvoidparse(JSONObjectobj,ListPairString,Stringfields){ Setstringsobj。keySet(); for(Stringstring:strings){ Objectoobj。get(string); if(onull){ continue; } PairString,StringstringStringPairnewPair(string,o。toString()); fields。add(stringStringPair); if(o。getClass()。getName()。equals(com。alibaba。fastjson。JSONObject)){ parse((JSONObject)o,fields); } } } 所以,作废作废婴幼儿照护费用的时候就可以直接调用这个方法: 从婴幼儿照护详情页的接口的返回数据里提取作废婴幼儿照护所需要的参数 StringtyxxfindJsonElement(JSONObject。toJSONString(res2),tyxx); StringznfyzcfindJsonElement(JSONObject。toJSONString(res2),znfyzc); 重写作废婴幼儿照护的入参代码 StringdeleteZnfyDatanewStringBuffer({) 。append()。append(bglxDm)。append()。append(:)。append()。append(2)。append()。append(,) 。append()。append(znfyzc)。append()。append(:)。append(znfyzc)。append(})。toString(); 打印作废婴幼儿照护的入参 System。out。println(deleteZnfyDatais:deleteZnfyData); 定义作废婴幼儿照护的接口 StringdeleteZnfyApiwebsbhlwyhzxfjkcdeleteZnfy; 执行作废婴幼儿照护的接口 ApiResponseres3requestHlw(deleteZnfyApi,HttpMethod。POST,JSON。parseObject(deleteZnfyData),yhm,device); StringbodyJSON。toJSONString(res3。getCode()); assertEquals(expectData,body); } EXCEL表格数据 以上是接口用例代码,最后附上excel表格数据: 除了保存婴幼儿照护费用的入参需要写到excel表格里,其他数据的传输和解析都在代码里实现了。 这样的场景用例我觉得是比较合理、有效、能反映问题的。你们觉得呢?