接口校验的N种方法

接口校验方法有很多种,校验全部、校验Body(或者Data)、校验某个字段、校验数据库……今天简单做个分享。

前面我们提到接口代码至少800次了,但是对于校验(断言)这块一直没有单独说,今天我们就唠一唠。

断言的意义

断言通常用来在Junit中判断测试结果是否和预期值一致,添加断言是为了找出错误。

断言的N种方法

最简单的getCode

Assert.assertEquals(expectCode,response.getCode());
Assert.assertEquals(expectMsg,response.getMsg());
Assert.assertEquals(expectStatus,response.getStatus());
复制代码

相对简单的getBody

assertEquals(Objects.toString(response.getBody(), ""), expectResult);
复制代码

校验全部返回1

Assert.assertEquals(Objects.toString(response, ""), expectData);
复制代码

校验全部返回2

AssertUtil.isJsonEquals(response, expectData, false);
复制代码

校验某些字段-低级版

校验返回数据body里的某几个字段

String body=JSON.toJSONString(response.getBody());
JSONObject jsonObject = JSON.parseObject(body);
JSONArray array = jsonObject.getJSONArray("otherArchiveNumberList");
String s =jsonObject.getString("archiveNumber");
JSONArray array2 =jsonObject.getJSONArray("archiveMergeDetailList");

assertEquals(bodyotherArchiveNumberList,JSON.toJSONString(array));
assertEquals(bodyarchiveNumber,s);
assertEquals(bodyarchiveMergeDetailList,JSON.toJSONString(array2));
复制代码

校验某些字段-相对高级版1

当返回的数据里data有值时返回data中的某几个字段,当data为空的时候则返回其他字段的错误提示语。

String Result=JSON.toJSONString(response);
JSONObject jsonObject = JSON.parseObject(Result);
//当data不为空的时候校验zrrdahs和zjls
if (response.getType().equals("SUCCESS"))
    if (jsonObject.getJSONObject("data")!=null) {
    String s = jsonObject.getJSONObject("data").getString("jls");
    AssertJUnit.assertEquals(expectData, s);
            }
//当data为空的时候则type为error,此时校验错误提示语
   if (jsonObject.getJSONObject("data")==null)
   assertEquals(Objects.toString(response.getErrorMessage(), ""), expectErrorMessage);
复制代码

其他说明:

Assert.assertEquals(Objects.toString(response, “”), expectData);

这里采用Objects.toString(response, “”)是为了避免当数据为空的时候报空指针。

assertEquals(Objects.toString(response.getErrorMessage(), “”), expectErrorMessage);

这里的response.getErrorMessage()是在response里做了get()和set()。

既然谈到这里就把Response贴一下,基本上可以通用。

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import org.apache.commons.lang3.StringUtils;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertTrue;
/**
 *
 * 客户端的返回
 */
public class ApiKhdResponse {

    private String type;

    private Object data;

    private String errorCode;

    private String errorMessage;

    private String reason;

    public JSONObject convert2JsonObject() {
        String dataText = JSON.toJSONString(data, SerializerFeature.WriteMapNullValue);
        JSONObject dataObject = JSON.parseObject(dataText);
        return dataObject;
    }

    public JSONArray convert2JsonArray() {
        String dataText = JSON.toJSONString(data, SerializerFeature.WriteMapNullValue);
        JSONArray dataArray = JSON.parseArray(dataText);
        return dataArray;
    }


    public String getType() {

        return this.type;
    }

    public void setType(String type) {

        this.type = type;
    }


    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    public String getErrorCode() {
        return errorCode;
    }

    public void setErrorCode(String errorCode) {
        this.errorCode = errorCode;
    }

    public String getErrorMessage() {
        return errorMessage;
    }

    public void setErrorMessage(String errorMessage) {
        this.errorMessage = errorMessage;
    }

    public String getReason() {
        return reason;
    }

    public void setReason(String reason) {
        this.reason = reason;
    }

    @Override
    public String toString() {
        return "ApiResponse{" +
                "type='" + type + '\'' +
                ", data=" + data +
                ", errorCode='
" + errorCode + '\'' +
                "
, errorMessage='" + errorMessage + '\'' +
                ", reason='" + reason + '\'' +
                '
}';
    }
    public <T> T getBodyBean(Class<T> clazz) { return JSON.parseObject(data.toString(), clazz); }
}
复制代码

校验某些字段-相对高级版2

//校验数据的返回,如果code返回正常则校验body,如果code返回异常则给出提示语。
String code=response.getHead().get("code");
  if ("00000000".equals(code)) {
  assertEquals(Objects.toString(response.getBody(), ""), expectResult);
  }else{
  assertEquals(Objects.toString(response.getMsg(), ""), expectResult);
复制代码

备注:

如果是使用这种校验方法需要在response做一些特别处理,如写一个assertSuccess()的方法,这里我也可以把完整的内容贴一下(不过这个可以在写断言的时候自动导入)。

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import org.apache.commons.lang3.StringUtils;
import java.util.Map;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertTrue;

public class XqyResponse {

    private Map<String, String> head;

    private Object body;

    public JSONObject convert2JsonObject() {
        String bodyText = JSON.toJSONString(body, SerializerFeature.WriteMapNullValue);
        JSONObject bodyObject = JSON.parseObject(bodyText);
        return bodyObject;
    }

    public JSONArray convert2JsonArray() {
        String bodyText = JSON.toJSONString(body, SerializerFeature.WriteMapNullValue);
        JSONArray bodyArray = JSON.parseArray(bodyText);
        return bodyArray;
    }

    public void assertSuccess() {
        String code = head.get("code");
        assertEquals("00000000", code);
    }

    public void assertFailed() {
    String code = head.get("code");
    //有些返回失败的接口,code直接为空
            assertTrue(true);
            return;
        }
        assertTrue(!code.equals("00000000") && !code.contains("1111111"));
    }

    public Map<String, String> getHead() {
        return head;
    }

    public void setHead(Map<String, String> head) {
        this.head = head;
    }

    public String getCode() {
        return head.get("code");
    }

    public String getMsg() {
        return head.get("msg");
    }

    public String getStatus(){
        return head.get("status");
    }

    public String getTime(){
        return head.get("time");
    }

    public Object getBody() {
        return body;
    }

    public void setBody(Object body) {
        this.body = body;
    }

    public <T> T getBodyBean(Class<T> clazz) {
        return JSON.parseObject(body.toString(), clazz);
    }
}
复制代码

校验包含某些数据

AssertUtil.isContains(response, expectData);
复制代码

校验数据库

//校验: returnSql的查询结果与期望的returnDB是否相等(type为SUCCESS时数据落库)
JsonUtils.assertDBEquals(jdbcTemplateOfSb, returnSql, returnDB);
复制代码

备注:

能做数据库校验是因为JDBC数据库驱动。JDBC即Java DataBase Connectivity,java数据库连接。JDBC提供的API可以让JAVA通过API方式访问关系型数据库,执行SQL语句,获取数据;常见关系型数据库如Oracle、MySQL、SQLServer等。

好啦,以上就是今天想要分享的内容,下期见!


非小埋语录

1.只有到了山顶才知道坚持的意义。

2.你自己要是翻不过这个篇来,没人能帮你过这个坎。

3.如果生活没让我俩笑出来,那是因为我们没有读懂这个笑话。

4.河都能入江,江都能入海,结局都是一样的,都能幸福,就是绕点弯路呗。

5.回忆需要靠物化。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享