• 0
  • 0
分享

  以前写多接口场景用例的时候,基本上一个测试类里只包含我的接口用例要调用的方法,如果有需要调用其他方法都是写到通用里。本次我尝试把我的接口用例要调用的其他的解析的方法也写在我的测试类里,感觉看起来也挺舒服的。

  关于接口自动化前面已经提到了很多很多,今天想记录这一篇是因为原本我可以敷衍地写完我的用例的,但是我还是认真思考了。感觉自己棒棒哒!

  接口背景

  · 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表格数据:

2.png

  除了保存婴幼儿照护费用的入参需要写到excel表格里,其他数据的传输和解析都在代码里实现了。

  这样的场景用例我觉得是比较合理、有效、能反映问题的。你们觉得呢?


作者:喂喂喂喂喂    

来源:http://www.51testing.com/html/42/n-4481142.html

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 写测试用例的时候,不能想到什么就写什么,要按照一定的测试用例模板去写,要有自己的思路,不能完全去套用模拟以前的测试用例,按照一整套的测试流程来分析重要的关注点,时间长也会有自己积累的一套的测试模式,按照框架的思路,可能会达到事半功倍的效果哦!功能测试框架一般情况就是包含以下几类:界面友好性测试、功能测试、页面链接测试、容错测试、稳定性测试、性能测试(简单方面)等等。1.1.1界面友好性测试风格、样式的协调性是否合理界面布局是否整齐,尽量不要使用滚动条界面操作、标题描述要恰当操作符合大众的常规习惯提示界面符合规范(不要出现中英混写)界面中各个控件是否整齐美观日期控件是否可正常编辑、长度是否合理,...
            0 1 1184
            分享
          • 1.你是如何看待帮助别人工作?答:经过领导同意,在不影响自己的本职工作的前提条件下,我很支持同事之间的互帮互助。2.测试流程你们公司是怎么开展的答:我们公司是需求评审—编写测试用例—用例评审—执行测试(冒烟测试—系统测试—回归测试)—测试报告—上线3.项目上线的原则答:测试用例全部执行完成需求全部覆盖BUG单全部关闭4.版本谁来发布?答:开发发布版本5.测试工程师平时的工作答:参与需求评审编写测试用例测试用例评审执行测试用例提交bug,跟踪bug提交测试日报提交测试报告过程的评价软件本身的评价6.测试报告发给谁,内容?答:发给项目相关人员,开发,产品,UI,同组测试人员内容:测试范围,准出标准...
            0 0 1815
            分享
          • 补充背景:系统 A 与 系统 B 数据交互的方式:系统 A 直连系统 B 的数据库。读者提问:我们团队负责测试的系统A,数据源来自兄弟团队负责测试的系统B。现在存在的问题是:系统B 的生产环境和测试环境都是生产数据,我们在测试环境没有数据可测,只能上生产验证。有什么解决办法吗?阿常回答:短期解决方案:在你们系统 A 的测试环境同步一份系统 B 的生产环境数据。长期解决方案:搭建大数据平台,将所有上游系统的数据都同步到你们的大数据平台。读者朋友阿朵问阿常上述问题:测试环境没有上游系统的数据,怎么办 ?阿朵负责测试系统 A,今天领导给她安排了一个新任务,系统 A 要新对接一个系统 B,系统 A 从...
            0 0 1434
            分享
          • python接口自动化实战目标学习数据库相关,用例增加对数据库校验利用数据库完成对数据查询如何校验数据库数据,怎样添加校验让程序自己校验(充值、提现、投资接口对金额的校验)知识补充用例之间关联性不要太强,比如每个模块的用例都需要登录状态,在每个模块最开始加上一次登录的用例即可。关于登录、充值啥的,用例里面的手机号最好不要写死,万一该手机号数据有脏数据,处理起来会很麻烦,所以一般在用例里面用变量,将数据放在指定的sheet里面方便读取与修改什么接口需要数据库校验?钱的变动、增减数据库安装mysql.connector模块 pip2 install --user mysql-connector基本...
            0 0 1510
            分享
          •       沐沐在性能测试过程中,主要使用的是JMeter,但是不管性能测试采用什么工具,都需要在性能测试执行过程中监控服务器资源情况,去分析性能瓶颈。本文将主要介绍一下top和htop命令。top:为linux自带的命令,能够实时监控系统给的运行状态,top命令执行后如下截图:load average:系统的运行队列的平均利用率,也可以认为是可运行进程的平均数。三个值分别表示在最后1分钟、5分钟、15分钟的平均负载值。例如在单核CPU的load average的值为1时表示满负荷状态。同理在多核CPU中满负载的load average的值是1*cpu核数。%Cp...
            2 0 3689
            分享
      • 51testing软件测试圈微信