接口测试 使用 rest-assured 进行接口测试

目录

前言

正文

[1.HTTP 状态码](#1.HTTP 状态码)

2.节点值验证

[3.格式化打印 json](#3.格式化打印 json)

4.参数化

5.响应时间

[6.JSON Schema Validation](#6.JSON Schema Validation)


前言

使用Rest-Assured进行接口测试是一个很好的选择。Rest-Assured是一个基于Java的开源库,专门用于简化和增强RESTful接口的测试。它提供了易于使用的API,可以轻松地发送HTTP请求、验证响应和解析JSON/XML等格式的数据。

说一下发帖的原因,由于偶然机会,得知了 rest-assured 这个项目,据说很棒的样子,我就屁颠屁颠到 Github 上,先把项目 fork 过来再说,不过研究源码可能是有生之年了 (〃ω〃)。

正好我们组在使用 Java 脚本进行接口测试,会需要写一些公共方法来验证接口返回的 json 节点神马的,当然保证状态码 200 肯定是前提。之前使用的是 net.sf.json,随便贴几行代码,Object、Array、String、JSONObject 神马的互相转换取值,讲道理挺容易被绕晕的。。。

而且,给同事讲解的时候也比较尴尬(抛出一个异常的眼神你们自己体会),有时候我们为了提升效率,还是不喜欢这种绕的做法。看 rest-assured 的用户手册时,首先看的就是节点取值验证部分,然后我 o゜▽゜) o,总之非常高兴就是了。

正文

接下来我就依据文档写了一些 demo,在这里分享下自己的经验,没啥厉害的,看看热闹就行~

首先,我使用 idea 新建了一个 maven 项目,添加了以下依赖:

<dependency>
    <groupId>io.rest-assured</groupId>
    <artifactId>rest-assured</artifactId>
    <version>3.0.1</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>io.rest-assured</groupId>
    <artifactId>json-schema-validator</artifactId>
    <version>3.0.1</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>io.rest-assured</groupId>
    <artifactId>spring-mock-mvc</artifactId>
    <version>3.0.1</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>RELEASE</version>
</dependency>

<dependency>
    <groupId>org.codehaus.groovy</groupId>
    <artifactId>groovy-all</artifactId>
    <version>1.8.1</version>
    <scope>provided</scope>
</dependency>

然后,写一个测试类,官方推荐我们在使用的时候,静态导入以下:

import static io.restassured.RestAssured.*;
import static io.restassured.matcher.RestAssuredMatchers.*;
import static io.restassured.path.json.JsonPath.from;
import static org.hamcrest.Matchers.*;
import static io.restassured.module.jsv.JsonSchemaValidator.*;

接下来就是我在接口测试中验证的常见逻辑了,实战 time,Go!

1.HTTP 状态码

@Test
public void test1() {
    Response response = get("url");//发起get请求,并获取响应
    if (response.getStatusCode() == 200) {//如果响应码等于200
     ///
    }
 }

先使用 get 方法发起请求(支持 HTTP 和 HTTPS,不需要我们手动调用不同的方法类啦),获得响应后就需要我们做进一步的处理。

2.节点值验证

比如对这样一串 json,

{
    "result": {
        "cardtablist": [
            {
                "id": 1,
                "name": "服务",
                "taburl": "",
                "type": "0"
            },
            {
                "id": 2,
                "name": "金融",
                "taburl": "https://demo/",
                "type": "1"
            }
        ]
    },
    "returncode": 0,
    "message": "ok"
}

我们可以简单写一下:

response.then().body("returncode", equalTo(0));//判断returncode是否等于
response.then().body("result.cardtablist", hasSize(2));//判断cardtablist数组的长度是否等于2
response.then().body("result.cardtablist[0].id", equalTo(1));//判断cardtablist数组第一个元素下,id字段值是否等于1
response.then().body("result.cardtablist[0].id", lessThan(2));//判断cardtablist数组第一个元素下,id字段值是否小于2
response.then().body("result.cardtablist[0].id", greaterThan(0));//判断cardtablist数组第一个元素下,id字段值是否大于0
response.then().body("result.cardtablist[0].name", not(""));//判断cardtablist第一个数组元素中name字段值不为""
response.then().body("result.cardtablist[0].name.length()", greaterThan(10));//判断cardtablist第一个数组元素中name字段值长度大于10
List<String> dspnameStr = from(jsonStr).getList("result.adlist.findAll { it.ishavead == 1 }.dspname");//得到所有的ishavead=1的adlist数组元素,并获取其中dspname的值,放在一个集合里

3.格式化打印 json

我觉得这个功能挺赞啊,省得打开浏览器去JSON在线解析及格式化验证 - JSON.cn做格式化。

response.getBody().prettyPrint();//格式化打印JSON数据

当然,控制台打印的 json 字符串不带颜色,这就不要挑剔了。

4.参数化

given().param("p1", "0").param("p2", "1").get("http://server/demo");

这里把参数拿出来单独赋值,最终会拼接成形如http://server/demo?p1=0&p2=1的链接并进行访问。

5.响应时间

when().get("https://server/demo?p1=0&p2=1").then().time(lessThan(100L),TimeUnit.MILLISECONDS);//判断响应时间是否少于预期值。

6.JSON Schema Validation

这个功能我也挺喜欢的,可以通过自己编写 json 指定要验证的结构字段(比如取值范围限定、字符串整型数组类型、必要字段是否存在等),具体内容有兴趣的同学可以自学一下。此处只展示 API 的调用:

get("https://server/demo?p1=0&p2=1").then().assertThat().body(matchesJsonSchemaInClasspath("test.json"));

这里我把写好的 test.json 文件放在 idea 自动生成的 src/main/resources 路径下,里面简单写了下:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "title": "Product set",
  "type": "object",
  "properties": {
    "result": {
      "type": "object"
    },
    "returncode": {
      "type": "integer"
    },
    "message": {
      "type": "integer"
    }
  },
  "required": [
    "result",
    "returncode",
    "message"
  ]
}

这里验证点有:保证返回 result、returncode、message 字段,并对每个字段的 value 进行类型限定。

作为一位过来人也是希望大家少走一些弯路

在这里我给大家分享一些自动化测试前进之路的必须品,希望能对你带来帮助。

(WEB自动化测试、app自动化测试、接口自动化测试、持续集成、自动化测试开发、大厂面试真题、简历模板等等)

相信能使你更好的进步!

点击下方小卡片

相关推荐
_.Switch12 分钟前
Python 自动化运维持续优化与性能调优
运维·开发语言·python·缓存·自动化·运维开发
徐*红13 分钟前
java 线程池
java·开发语言
尚学教辅学习资料13 分钟前
基于SSM的养老院管理系统+LW示例参考
java·开发语言·java毕设·养老院
2401_8576363913 分钟前
计算机课程管理平台:Spring Boot与工程认证的结合
java·spring boot·后端
小丑西瓜66614 分钟前
qt ui设计案例--登录界面
qt·ui·c/c++·qss
1 9 J15 分钟前
Java 上机实践4(类与对象)
java·开发语言·算法
Code apprenticeship16 分钟前
Java面试题(2)
java·开发语言
J不A秃V头A18 分钟前
Python爬虫:获取国家货币编码、货币名称
开发语言·爬虫·python
憨子周1 小时前
2M的带宽怎么怎么设置tcp滑动窗口以及连接池
java·网络·网络协议·tcp/ip
阿斯卡码2 小时前
jupyter添加、删除、查看内核
ide·python·jupyter