使用 rest-assured 也有一段时间了,虽然这个框架有很多优势,但最钟爱的还是 json 解析这块,对于我这种不爱太动脑子的人来说,拿来主义最适合了基本也满足了测试工作的日常所需 ,当然对于无法满足又想一次性解决的问题,也只能自己苦逼的去改八改八了 扯远了~
虽然也有在用 JsonPath 但与 rest-assured 的 JsonPath 来说,rest 的更加方便快捷,不过更恶心的 JAONArray 也在用......
示例接口:http://testerhome.com/api/v3/topics.json?limit=40&offset=0&type=last_actived
https://github.com/jayway/JsonPath
JsonPath 提供了很全的操作 JSON 的方法
获取 topcis 列表
List<String> topics = JsonPath.read(jsonStr,"$.topics")
获取 topcis 第一条记录
Object topics1 = JsonPath.read(jsonStr,"$.topics[0]");
获取 topcis 第一条记录中 title 的值
String topics1title = JsonPath.read(jsonStr,"$.topics[0].title");
获取 topcis 中所有 title 的名称
List<String> titles = JsonPath.read(jsonStr,"$.topics[*].title");
还有一个非常有意思的使用方法,通过属性进行获取
比如:获取 id=6421 的对象、获取 name == 恒温的
Object topicid = JsonPath.read(jsonStr,"$.topics[?(@.id == 6421)]");
Object topicname = JsonPath.read(jsonStr,"$.topics[*].user[?(@.name == '恒温')]");
获取 topcis 列表
List<String> topics = jsonPath.getList("topics");
获取 topcis 第一条记录
String topics1 =jsonPath.getString("topics[0]");
获取 topcis 第一条记录中 title 的值
String topics1title = jsonPath.getString("topics[0].title");
获取 topcis 中所有 title 的名称
List<String> titles = jsonPath.getList("topics.title");
和 jsonpath 一样也可以通过属性进行获取
比如:获取 id=6421 的对象、获取 name == 恒温的
String topicid = jsonPath.getString("topics.findAll{topics -> topics.id == 6421}");
String topicname = jsonPath.getString("topics.user.findAll{user -> user.name == '恒温'}");
对于测试同学来说,这些是不是非常的方便,也很容易上手呢
但是在实际测试过程中单纯的取值判断是不可能满足测试需要,往往还需要对结构进行整体验证,对于这类检查,只能自己苦逼的码代码了,本人非专业开发人士,相关卫道者请轻拍
有需要的同学可以拿去改八改八耍~~ 当然如有问题也请及时CALL我,我也同步修改一下。。。。。。
/**
* 验证json串结构是否正确
* @param jsonStr 接口返回的json串
* @param checkStr 要验证的一级节点字符串,多个值以逗号分隔 便如:"limitedbuy,name"
* @param checkList 要验证的二级以下节点字符串,目录以冒号分隔,如果是更深目录 只要在二加入路径即可,"limitedbuy:starttime,endtime,limitedbuyinfo;name/setting:name,age"
* @return String 返回验证的结果集,如果为空,验证成功,如果不为空验证失败
* @throws IOException
*/
public static String jsonUtiltest(String jsonStr,String checkStr,String checkList) throws IOException{
StringBuilder errStr = new StringBuilder();
JSONObject jsonObj = JSONObject.fromObject(jsonStr);
String returncode = jsonObj.getString("returncode");
if (returncode.equals("0")){
//如果result返回了[]或{}直接跳出循环,告知无值
//判断是否有result节点,如果没有就算成功结束
if(jsonObj.containsKey("result"))
{
if(!(jsonObj.getString("result").equals("{}")) || !(jsonObj.getString("result").equals("[]"))){
if(!jsonObj.getString("result").equals(""))
{
JSONObject jo=null;
JSONArray ja = null;
Object o = jsonObj.get("result");
if(o instanceof JSONObject){
jo = (JSONObject) o;
//先去验证主节点
errStr.append(valjsonobject(jo,checkStr,"result"));
if(checkList.length()>0){
//再去验证子节点
String[] strlist = checkList.split(";");
for (int i = 0; i < strlist.length; i++) {
String[] childnodeval = strlist[i].split(":");
errStr.append(valjsonobject2(jo,childnodeval[0],childnodeval[1]));
}
}
}else if(o instanceof JSONArray){
ja = (JSONArray) o;
for (int i = 0; i < ja.size(); i++) {
//还得先去验证主节点
errStr.append(valjsonobject(ja.getJSONObject(i),checkStr,"result"));
}
}
}
}
}
}else{
errStr.append("错误码:"+returncode+"\n\r 错误信息:"+jsonObj.getString("message"));
}
return errStr.toString();
}
public static String valjsonobject(JSONObject json ,String checkStr ,String path){
Iterator it = json.keys();
List<String> keyListstr = new ArrayList<String>();
while(it.hasNext()){
//遍历json第一层
keyListstr.add(it.next().toString());
}
StringBuilder errStr = new StringBuilder();
String[] checkStrs = checkStr.split(",");
if(checkStrs.length == keyListstr.size()){
for (int j = 0; j < checkStrs.length; j++) {
int count = 0;
for (int i = 0; i < keyListstr.size(); i++){
if (checkStrs[j].equals(keyListstr.get(i))){
count++;
if (count > 1 && i == keyListstr.size()-1){//对返回相同的字段进行追加。
errStr.append(path+"节点下返回相同的字段是:"+checkStrs[j]+". ");
}
}else{
if( count < 1 && i == keyListstr.size()-1 ){
errStr.append(path+"节点下返回的节点缺少字段:"+checkStrs[j]+". ");
}
}
}
}
}else{
if(checkStrs.length < keyListstr.size()){
//add判断是否存在相同的字段。
for (int j = 0; j < checkStrs.length; j++) {
int count = 0;
for (int i = 0; i < keyListstr.size(); i++){
if (checkStrs[j].equals(keyListstr.get(i))){
count++;
if (count > 1 && i == keyListstr.size()-1){//对返回相同的字段进行追加。
errStr.append(path+"节点下返回相同的字段是:"+checkStrs[j]+". ");
}
}
}
}
//add判断是否存在错误的字段。
for (int i = 0; i < keyListstr.size(); i++) {
for (int j = 0; j < checkStrs.length; j++){
if (keyListstr.get(i).equals(checkStrs[j])){
break;
}
else{
if(j == checkStrs.length-1 ){
errStr.append(path+"节点下多了字段:"+keyListstr.get(i)+". ");
}
}
}
}
}else{
for (int j = 0; j < checkStrs.length; j++) {
int count = 0;
for (int i = 0; i < keyListstr.size(); i++){
if (checkStrs[j].equals(keyListstr.get(i))){
count++;
if (count > 1 && i == keyListstr.size()-1){//对返回相同的字段进行追加。
errStr.append(path+"节点下返回相同的字段是:"+checkStrs[j]+". ");
}
}else{
if( count < 1 && i == keyListstr.size()-1 ){
errStr.append(path+"节点下缺少字段:"+checkStrs[j]+". ");
}
}
}
}
}
}
return errStr.toString();
}
public static String valjsonobject2(JSONObject json ,String path,String checkStr){
JSONObject jo=null;
JSONArray ja = null;
Object o;
String errStr="";
if(path.contains("/")){
//拆分路径
String[] paths = path.split("/");
o = json.get(paths[0]);
path = path.replace(paths[0]+"/", "");
//如果子节点是object对象
if(o instanceof JSONObject){
jo = (JSONObject) o;
if(jo.keySet().size()>0){
errStr = valjsonobject2(jo,path,checkStr);
}
}else if(o instanceof JSONArray){
ja = (JSONArray) o;
for (int i = 0; i < ja.size(); i++) {
errStr = valjsonobject2(ja.getJSONObject(i),path,checkStr);
}
}
}else{
o = json.get(path);
//如果子节点是object对象
if(o instanceof JSONObject){
jo = (JSONObject) o;
if(jo.keySet().size()>0){
errStr = valjsonobject(jo,checkStr,path);
}
}else if(o instanceof JSONArray){
ja = (JSONArray) o;
for (int i = 0; i < ja.size(); i++) {
errStr = valjsonobject(ja.getJSONObject(i),checkStr,path);
}
}
}
return errStr;
}