接口自动化场景用例——对象嵌套对象

发表于:2022-2-08 09:10

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:喂喂喂喂喂    来源:掘金

  以前写多接口场景用例的时候,基本上一个测试类里只包含我的接口用例要调用的方法,如果有需要调用其他方法都是写到通用里。本次我尝试把我的接口用例要调用的其他的解析的方法也写在我的测试类里,感觉看起来也挺舒服的。
  关于接口自动化前面已经提到了很多很多,今天想记录这一篇是因为原本我可以敷衍地写完我的用例的,但是我还是认真思考了。感觉自己棒棒哒!

  接口背景
  ·saveZnfy   保存婴幼儿照护费用
  ·queryZxfjkcZnfyXq查询婴幼儿照护费用详情
  ·deleteZnfy作废婴幼儿照护费用
  看这三个接口,我想也知道我今天要写的场景是啥了吧?没错!
  保存婴幼儿照护费用 -> 查询婴幼儿照护费用详情 -> 作废婴幼儿照护费用。

  数据关系
  保存婴幼儿照护费用,返回CJLSH和CJXH;
  拿着CJLSH和CJXH可以查询婴幼儿照护费用详情,且返回婴幼儿照护费用相关信息;
  拿着婴幼儿照护费用相关信息可以作废该条婴幼儿照护费用。

  接口代码
  保存婴幼儿照护费用 -> 查询婴幼儿照护费用详情 -> 作废婴幼儿照护费用。
package com.XXXXXXX.api.XX.XXX.XXX.XXXXX;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import com.XXXXXXX.basedata.DataBaseName;
import com.XXXXXXX.basedata.GroupName;
import com.XXXXXXX.common.ApiResponse;
import com.XXXXXXX.common.EtaxHttpRequest;
import com.XXX.api.util.AssertUtil;
import com.XXX.api.util.JdbcUtil;
import javafx.util.Pair;
import org.springframework.http.HttpMethod;
import org.testng.annotations.Test;
import ru.yandex.qatools.allure.annotations.Title;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import static org.testng.AssertJUnit.assertEquals;

/**
 * create by lxl01 on 2021/12/11
 */
@Title(" 婴幼儿照护费用-多接口-保存、查询、作废场景用例")
public class SaveZnfyAndQueryZxfjkcZnfyXqAndDeleteZnfyTest extends EtaxHttpRequest {

    @Test(dataProvider = "excel", groups={GroupName.WEB_SB})
    public void testSaveZnfyAndQueryZxfjkcZnfyXqAndDeleteZnfy(String run, String testName,String yhm, String data, String beforeSql,String expectData, String device) {
        //执行前置sql,删除已采集的数据
        JdbcUtil.jdbcBatchUpdate(jdbcTemplateDynamic(DataBaseName.SB), beforeSql);
        //定义婴幼儿照护费用的保存接口
        String SaveZnfyApi = "/web/sb/hlw/yh/zxfjkc/saveZnfy";
        //执行婴幼儿照护费用保存接口
        ApiResponse SaveZnfyApirespose = requestHlw(SaveZnfyApi, HttpMethod.POST, JSON.parseObject(data), yhm, device);
        //打印婴幼儿照护费用保存接口的返回数据
        System.out.println(SaveZnfyApirespose);
        //从婴幼儿照护费用保存接口的返回数据里提取查询婴幼儿照护详情页所需要的参数
        String cxxx = (String)((JSONObject) SaveZnfyApirespose.getData()).get("cjlsh");
        String cxxx2 = (String)((JSONObject)SaveZnfyApirespose.getData()).get("cjxh");
        //重写查询婴幼儿照护详情页的入参代码
        String QueryZxfjkcZnfyXqData = "{"+""zxfjkclxDm":"0207""+","cjlsh":""+cxxx+"","+""cjxh":""+cxxx2+"","+""sbkcnd":"2021""+"}";
       //打印婴幼儿照护费用详情页的入参
        System.out.println("QueryZxfjkcZnfyXqData is****!!!???:" + QueryZxfjkcZnfyXqData);
        //定义婴幼儿照护费用详情页的接口
        String QueryZxfjkcZnfyXqApi = "/web/sb/hlw/yh/zxfjkc/queryZxfjkcZnfyXq";
        //执行婴幼儿照护费用详情页的接口
        ApiResponse res2 = requestHlw(QueryZxfjkcZnfyXqApi, HttpMethod.POST, JSON.parseObject(QueryZxfjkcZnfyXqData), yhm, device);
       //取出婴幼儿照护费用详情页的接口的返回
        System.out.println("res2 is****!!!???:" + res2);
     //从婴幼儿照护详情页的接口的返回数据里提取作废婴幼儿照护所需要的参数
        String tyxx =  findJsonElement(JSONObject.toJSONString(res2),"tyxx");
        String znfyzc =  findJsonElement(JSONObject.toJSONString(res2),"znfyzc");

        //重写作废婴幼儿照护的入参代码
        String deleteZnfyData = new StringBuffer("{")
                .append(""").append("bglxDm").append(""").append(":").append(""").append("2").append(""").append(",")
                .append(""").append("znfyzc").append(""").append(":").append(znfyzc).append("}").toString();
        //打印作废婴幼儿照护的入参
        System.out.println("deleteZnfyData is&&&&*****:" + deleteZnfyData);
        //定义作废婴幼儿照护的接口
        String deleteZnfyApi = "/web/sb/hlw/yh/zxfjkc/deleteZnfy";
        //执行作废婴幼儿照护的接口
        ApiResponse res3 = requestHlw(deleteZnfyApi, HttpMethod.POST, JSON.parseObject(deleteZnfyData), yhm, device);
        String body=JSON.toJSONString(res3.getCode());
        assertEquals(expectData,body);
    }

    /**
     * 根据字段获取json对应的value内容 返回字符串    适用于对象嵌套对象
     * @param json
     * @param findEle
     * @return
     */
    public static String findJsonElement(String json, String findEle) {
        List<Pair<String, String>> fields = new ArrayList<>();
        JSONObject jsonObject = null;
        try {
            jsonObject = JSON.parseObject(json);
        } catch (JSONException e) {
            return "解析异常";
        }
        parse(jsonObject, fields);
        for (Pair<String, String> field : fields) {
            if (field.getKey().equalsIgnoreCase(findEle)) {
                return field.getValue();
            }
        }
        return "不存在";
    }

    /**
     * 递归解析
     * @param obj
     * @param fields
     */
    public static void parse(JSONObject obj, List<Pair<String, String>> fields) {
        Set<String> strings = obj.keySet();
        for (String string : strings) {
            Object o = obj.get(string);
            if (o == null) {
                continue;
            }
            Pair<String, String> stringStringPair = new Pair<>(string, o.toString());
            fields.add(stringStringPair);
            if (o.getClass().getName().equals("com.alibaba.fastjson.JSONObject")) {
                parse((JSONObject) o, fields);
            }
        }
    }
}

  我的亮点
  作废婴幼儿照护费用是亮点。
  首先,保存婴幼儿照护费用 -> 查询婴幼儿照护费用详情这一段是很简单的。
//定义婴幼儿照护费用的保存接口
        String SaveZnfyApi = "/web/sb/hlw/yh/zxfjkc/saveZnfy";
        //执行婴幼儿照护费用保存接口
        ApiResponse SaveZnfyApirespose = requestHlw(SaveZnfyApi, HttpMethod.POST, JSON.parseObject(data), yhm, device);
        //打印婴幼儿照护费用保存接口的返回数据
        System.out.println(SaveZnfyApirespose);
        //从婴幼儿照护费用保存接口的返回数据里提取查询婴幼儿照护详情页所需要的参数
        String cxxx = (String)((JSONObject) SaveZnfyApirespose.getData()).get("cjlsh");
        String cxxx2 = (String)((JSONObject)SaveZnfyApirespose.getData()).get("cjxh");
        //重写查询婴幼儿照护详情页的入参代码
        String QueryZxfjkcZnfyXqData = "{"+""zxfjkclxDm":"0207""+","cjlsh":""+cxxx+"","+""cjxh":""+cxxx2+"","+""sbkcnd":"2021""+"}";
       //打印婴幼儿照护费用详情页的入参
        System.out.println("QueryZxfjkcZnfyXqData is****!!!???:" + QueryZxfjkcZnfyXqData);
        //定义婴幼儿照护费用详情页的接口
        String QueryZxfjkcZnfyXqApi = "/web/sb/hlw/yh/zxfjkc/queryZxfjkcZnfyXq";
        //执行婴幼儿照护费用详情页的接口
        ApiResponse res2 = requestHlw(QueryZxfjkcZnfyXqApi, HttpMethod.POST, JSON.parseObject(QueryZxfjkcZnfyXqData), yhm, device);

  但是作废婴幼儿照护费用这一段就没有那么好玩了,我们来看下作废婴幼儿照护费用所需要的参数:
{
    "bglxDm": "2",
    "tyxx": {
        "nsrxm": null,
        "nsrsjhm": "187****9200",
        "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": "187****9200",
        "nsrdzyx": "",
        "nsrtxdz": "不告诉你",
        "zndah": null,
        "jtcyxh": "5000006",
        "xm": "哈哈",
        "sfzjlxDm": "291",
        "sfzjhm": "L****************1",
        "gjhdqszDm": "156",
        "gjhdqszmc": "中华人民共和国",
        "csrq": "2021-12-20",
        "fpbl": 100,
        "cfjlzt": "0",
        "ynsrgxDm": "2"
    }
}

  这个接口的参数很常见,如果我们直接把这个参数放到表格里,接口调用直接JSON.parseObject(Data)就能解析出来,但是我现在要从上一个接口(查询婴幼儿照护费用详情页)返回并解析给下一个接口(作废婴幼儿照护费用)当入参,所以写了一个解析的方法,如下:
/**
     * 根据字段获取json对应的value内容 返回字符串    适用于对象嵌套对象
     * @param json
     * @param findEle
     * @return
     */
    public static String findJsonElement(String json, String findEle) {
        List<Pair<String, String>> fields = new ArrayList<>();
        JSONObject jsonObject = null;
        try {
            jsonObject = JSON.parseObject(json);
        } catch (JSONException e) {
            return "解析异常";
        }
        parse(jsonObject, fields);
        for (Pair<String, String> field : fields) {
            if (field.getKey().equalsIgnoreCase(findEle)) {
                return field.getValue();
            }
        }
        return "不存在";
    }

    /**
     * 递归解析
     * @param obj
     * @param fields
     */
    public static void parse(JSONObject obj, List<Pair<String, String>> fields) {
        Set<String> strings = obj.keySet();
        for (String string : strings) {
            Object o = obj.get(string);
            if (o == null) {
                continue;
            }
            Pair<String, String> stringStringPair = new Pair<>(string, o.toString());
            fields.add(stringStringPair);
            if (o.getClass().getName().equals("com.alibaba.fastjson.JSONObject")) {
                parse((JSONObject) o, fields);
            }
        }
    }

  所以,作废作废婴幼儿照护费用的时候就可以直接调用这个方法:
//从婴幼儿照护详情页的接口的返回数据里提取作废婴幼儿照护所需要的参数
        String tyxx =  findJsonElement(JSONObject.toJSONString(res2),"tyxx");
        String znfyzc =  findJsonElement(JSONObject.toJSONString(res2),"znfyzc");

        //重写作废婴幼儿照护的入参代码
        String deleteZnfyData = new StringBuffer("{")
                .append(""").append("bglxDm").append(""").append(":").append(""").append("2").append(""").append(",")
                .append(""").append("znfyzc").append(""").append(":").append(znfyzc).append("}").toString();
        //打印作废婴幼儿照护的入参
        System.out.println("deleteZnfyData is&&&&*****:" + deleteZnfyData);
        //定义作废婴幼儿照护的接口
        String deleteZnfyApi = "/web/sb/hlw/yh/zxfjkc/deleteZnfy";
        //执行作废婴幼儿照护的接口
        ApiResponse res3 = requestHlw(deleteZnfyApi, HttpMethod.POST, JSON.parseObject(deleteZnfyData), yhm, device);
        String body=JSON.toJSONString(res3.getCode());
        assertEquals(expectData,body);
    }

  EXCEL表格数据
  以上是接口用例代码,最后附上excel表格数据:

  除了保存婴幼儿照护费用的入参需要写到excel表格里,其他数据的传输和解析都在代码里实现了。
  这样的场景用例我觉得是比较合理、有效、能反映问题的。你们觉得呢?

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号