接口测试 如何验证复杂的 json 各个节点数据的正确性

叶子 · 2017年09月07日 · 867 次阅读

背景及疑问

最近打算做公司的 web 端产品的接口测试,首先说明一下,后台接口有一大半是用于提供数据的查询,且接口返回的 json 较复杂,一个字段里可能有多个 list,list 里面包含的字段下面可能又有多个 list。我们选择的框架是 java+junit+maven,断言用的是 assert J。在落地的过程中,遇到了关于接口返回的复杂的 json 的验证问题。以下先展示我已完成的一个简单单接口的处理方法。

我的处理方案

接口返回的 json

{
"code": 0,
"msg": null,
"data": [
{
"year": 5262,
"grade": 5265,
"name": "312"
},
{
"year": 89606,
"grade": 5260,
"name": "2"
},
{
"year": 5262,
"grade": 5258,
"name": "9"
},
]
}

设计的实体类

public class Respones{
private String code;
private String msg;
private List<Info> data;
setter();getter();
}
public class Info{
private String name;
private int grade;
private int year;
setter();getter();
}

测试用例

@Test()
public void getClasses()
{
GetInfoCommon getInfo =new GetInfoCommon(); //封装的接口方法类
Respones respones=new Respones ();
try {
respones=getInfo.getClassesAPI("/class/get-classes"); //接口方法
assertThat(respones).isEqualToComparingFieldByFieldRecursively(respones2); //断言respones的属性值是否与期望值respones2一致
}
}

我的处理方式是根据 json 设计 bean,然后将 json 数据反序列化为 javabean,最终判断两个 bean 的值是否一致达到断言。那么问题来了,针对例子中的 json,已经对应设计了两个 bean,而我还有更多更复杂的 json,是否是每个 json 都要设计对应的 bean。而且不同的 json 中,会有重复的 list。例如上面的 json 中有个 Info 类型的 list,而在其他 json 中,这个 list 又会在某个 list 下面的某个字段里,如:
{
"code": 0,
"msg": null,
"data": {
"list": {
"2017-09-08": {
"weekday": "周五",
"info": {
{
"year": 89606,
"grade": 5260,
"name": "2"
},
{
"year": 5262,
"grade": 5258,
"name": "9"
}}},
"2017-09-09": {
"weekday": "周六",
"info": {
{
"year": 89607,
"grade": 5260,
"name": "1"
},
{
"year": 5272,
"grade": 5258,
"name": "9"
}}},
}}}

如果在针对第二个 json 再重新设计 javabean,就有太多的 bean 类且部分内容字段存在重复。

写在最后

初次结合实际项目开展接口测试,上文所介绍的处理方案也是我在 testerhome 社区及网上的其他处看到的接口测试文章借鉴而来。对于以上说到的疑惑,想请问下大家有没有一些好的方法处理,比如还可不可以在哪个层面进行封装。因为接口多数是提高查询服务,所以 json 中的每个节点都需要判断。我的想法还是希望能够继续对比 javabean 去实现断言,且期望值 javabean 是通过查询数据库进行赋值的。
第一次发帖,有点紧张。期待回复,感谢 testerhome 平台~

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册