如何自动化测试你的接口?—— Rest Assured
前言
不知道大家的项目是否都有对接口API进行自动化测试,反正像我们这种小公司是没有的。由于最近一直被吐槽项目质量糟糕,只能研发自己看看有什么接口测试方案。那么在本文中,我将探索如何使用 Rest Assured 自动化 API 测试,Rest Assured 是一个基于 Java 的流行的用于测试 RESTful API 的库。
什么是Rest Assured?
Rest Assured 是一个基于 Java 的开源库,主要用于测试 RESTful API。它为编写测试用例提供了一种简单直观的 DSL(领域特定语言),这使得开发人员可以轻松编写和维护自动化测试。Rest Assured 支持 GET、POST、PUT、DELETE、PATCH 等各种 HTTP 方法,并且可以轻松与流行的测试框架(如 TestNG 和 JUnit)集成。
github地址:https://github.com/rest-assured/rest-assured
安装Rest Assured
在maven中引入相关依赖
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<version>5.3.0</version>
<scope>test</scope>
</dependency>
Rest Assured结构
Rest Assured代码的整体结构分为 3 个主要部分:
- Given
Given是 API 测试的先决条件,可以在其中设置测试所需的一切,例如URL、请求头或参数,或任何需要满足的先决条件。- 可以在“
Given”中设置的内容:URL、请求头、请求参数和请求正文。
- When
When是实际向服务器发送 HTTP 请求并获得响应的时间。可以在When中定义请求方法,如GET、POST、PUT等。
- Then
Then是您检查从服务器获得的响应并确保它符合您的预期的地方。在这您可以检查状态代码、响应正文、标头或任何其他对您的测试很重要的内容。
Show Me Code
我们现在通过一个例子来演示下如何使用Rest Assured,首先我们看下postman的例子:
- 请求参数
- 请求头
- 请求体
现在我们用Rest Assured这个框架来测试下上面postman的这个接口。
import io.restassured.builder.RequestSpecBuilder;
import io.restassured.response.Response;
import io.restassured.specification.RequestSpecification;
import org.testng.annotations.Test;
import static io.restassured.RestAssured.given;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.lessThan;
public class TestRestAssured {
@Test
public void testMyApi() {
String jsonBody = "{"email":"dhadiprasetyo@gmail.com","uid":"Jzr0sOORprar10kay6CweZ5FNYP2"}";
Response response = given().baseUri("http://127.0.0.1:8000")
.queryParam("version", "1.0")
.header("Authorization", "yourauthhere")
.header("Signature", "yoursignaturehere")
.body(jsonBody)
.when().post("/getuserdata/")
.then().assertThat().statusCode(200)
.header("Content-Type", "application/json")
.header("Cache-Control", "max-age=3600")
.body("name", equalTo("Darmawan Hadiprasetyo"))
.time(lessThan(5000L))
.extract().response();
}
}
- 首先我们在
given()中设置前置条件
given().baseUri("http://127.0.0.1:8000")
.queryParam("version", "1.0")
.header("Authorization", "yourauthhere")
.header("Signature", "yoursignaturehere")
.body(jsonBody)
- 然后在
when()中定义请求方法,本例中为POST
.when().post("/getuserdata/")
- 然后我们从我们的请求中断言状态代码、标头、正文和响应时间
.then().assertThat().statusCode(200)
.header("Content-Type", "application/json")
.header("Cache-Control", "max-age=3600")
.body("name", equalTo("Darmawan Hadiprasetyo"))
.time(lessThan(5000L))
.extract().response();
如何提取响应体?
例如,这将是我们对之前请求的回应:
{
"name": "alvin",
"role": "SDET"
}
以下是我们如何提取这些数据:
JsonPath responseBody = response.jsonPath();
String fullName = responseBody.getString("name");
String role = responseBody.getString("role");
统一抽象封装
在大多数情况下,需要测试许多 API,但前提条件相同,例如 BaseURL、参数和请求头等,为了消除代码中的冗余,我们可以统一抽象封装一个 RequestSpecification 类作为我们的规范构建器,并在我们的其他测试中重用它,如下所示:
import io.restassured.builder.RequestSpecBuilder;
import io.restassured.path.json.JsonPath;
import io.restassured.response.Response;
import io.restassured.specification.RequestSpecification;
import org.testng.annotations.Test;
import static io.restassured.RestAssured.given;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.lessThan;
public class TestRestAssured {
public static RequestSpecification requestSpecification() {
return new RequestSpecBuilder().setBaseUri("http://127.0.0.1:8000")
.addQueryParam("version", "1.0")
.addHeader("Authorization", "yourauthhere")
.addHeader("Signature", "yoursignaturehere")
.build();
}
@Test
public void testMyApi() {
String jsonBody = "{"email":"dhadiprasetyo@gmail.com","uid":"Jzr0sOORprar10kay6CweZ5FNYP2"}";
Response response = given().spec(requestSpecification())
.body(jsonBody)
.when().post("/getuserdata/")
.then().assertThat().statusCode(200)
.header("Content-Type", "application/json")
.header("Cache-Control", "max-age=3600")
.body("name", equalTo("Darmawan Hadiprasetyo"))
.time(lessThan(5000L))
.extract().response();
JsonPath responseBody = response.jsonPath();
String fullName = responseBody.getString("name");
String linkedIn = responseBody.getString("linkedin");
String role = responseBody.getString("role");
}
}
现在,您可以在具有相同前提条件的任何其他需要的测试中重用 requestSpecification() 方法。查看与我们之前代码的区别:
// previous
Response response = given().baseUri("http://127.0.0.1:8000")
.queryParam("version", "1.0")
.header("Authorization", "yourauthhere")
.header("Signature", "yoursignaturehere")
.body(jsonBody)
.when().post("/getuserdata/")
// then
Response response = given().spec(requestSpecification())
.body(jsonBody)
.when().post("/getuserdata/")
通过使用 given().spec(),我们的代码现在变得简单多了。
结论
本文简单介绍了Rest Assured这个开源的接口测试框架是干嘛的,以及如何使用的,希望对大家有帮助。
欢迎关注个人公众号【JAVA旭阳】交流沟通
如何自动化测试你的接口?—— Rest Assured的更多相关文章
- Python自动化测试面试题-接口篇
目录 Python自动化测试面试题-经验篇 Python自动化测试面试题-用例设计篇 Python自动化测试面试题-Linux篇 Python自动化测试面试题-MySQL篇 Python自动化测试面试 ...
- python - 接口自动化测试 - TestRecharge - 充值接口测试用例
# -*- coding:utf-8 -*- ''' @project: ApiAutoTest @author: Jimmy @file: test_recharge.py @ide: PyChar ...
- python - 接口自动化测试 - TestLogin - 登录接口测试用例
# -*- coding:utf-8 -*- ''' @project: ApiAutoTest @author: Jimmy @file: test_login.py @ide: PyCharm C ...
- python - 接口自动化测试 - TestRegister - 注册接口测试用例
# -*- coding:utf-8 -*- ''' @project: ApiAutoTest @author: Jimmy @file: test_register.py @ide: PyChar ...
- XXX接口自动化测试方案
XXX接口自动化测试方案 1.引言 1.1 文档版本 版本 作者 审批 备注 V1.0 XXXX 创建测试方案文档 1.2 项目情况 项目名称 XXX 项目版本 V1.0 项目经理 XX 测试人员 X ...
- python web自动化测试框架搭建(功能&接口)——接口用例实现
测试用例基类: # coding=utf-8 import unittest import Logger log = Logger.Loger() class BaseCase(unittest.Te ...
- python web自动化测试框架搭建(功能&接口)——接口公共方法
接口公共方法有:数据引擎.http引擎.Excel引擎 1.数据引擎:获取用例.结果检查.结果统计 # -*- coding:utf-8 -*- from XlsEngine import XlsEn ...
- python web自动化测试框架搭建(功能&接口)——接口测试模块
Python接口测试采用python读取excel的方法,通过requests库发送请求和接收响应.模块有: Data:用于存放excel用例的,用例格式: iutil: 接口公共方法,数据引擎.ht ...
- python web自动化测试框架搭建(功能&接口)——功能测试模块
功能测试使用selenium,模块有: 1.futil: 公共方法,如元素高亮显示 # coding=utf-8 """高亮显示元素""" ...
- python web自动化测试框架搭建(功能&接口)——测试用例执行和结果收集
由于unittest框架中结果收集在不同文件中,所以此处重写结果收集方法,加入执行时间,失败信息,失败截图等 TestRunner.py # coding=utf-8 import sys impor ...
随机推荐
- grub boot kali
the partition of labled '/' is /dev/sdb8 (eg:(hdb1,gpt8)) linux (hdb1,gpt8)/vmliuz root=/dev/sdb8 in ...
- 网页制作02--banner制作
样本: 第一步:先做一个超大的通栏banner盒子. 第二步:在通栏盒子里面做一个版心的盒子 第三部:版心盒子里面在分左边盒子和右边盒子 1号盒子是通栏的大盒子banner,不给宽度,给高度.给一个蓝 ...
- feign远程调用接口报空指针
今天对feign接口进行转移的时候再次启动一直报空指针,找了好久试了好多次才发现是没有对feign接口加注解 请一定要记得加自动注入的注解啊啊啊啊啊啊!!!!!!!
- netty库包冲突问题
参考 http://www.yayihouse.com/yayishuwu/chapter/1603 报错信息:Caused by: java.lang.NoSuchFieldError: netty ...
- CC2020 分享信息
CC2020是鄙人第一次参与的国际计算教育报告.CC2020报告的特色是希望面向未来的教育能走近每一个教育的利益相关者,包括家长.学生.行业雇主.政府决策制定者和学术界人士.敬请各位从自己的身份角度对 ...
- CentOS7 yum方式安装mysql 5.7
1.检查服务器上有没有安装mysqlyum安装方式:yum list installed mysql*yum卸载 yum remove 已安装的包卸载完安装包后,删除安装文件rm -rf /var/l ...
- iOS Unity 项目解析
本文旨在记录Unity 导出的iOS 项目笔记,另带接入SDK的终极方案,顺带对比Android 项目 1蓝色的目录 Data 这个就是项目的数据,每个项目不一样也就是这个目录不一样,是不是可以把这个 ...
- FCC 中级算法题 Arguments Optional
Arguments Optional 创建一个计算两个参数之和的 function.如果只有一个参数,则返回一个 function,该 function 请求一个参数然后返回求和的结果. 例如,add ...
- 【线性DP】乌龟棋
#include<bits/stdc++.h> using namespace std; int a[400],b[5]; int dp[50][50][50][50]; int main ...
- 实验2 C语言分支语句、循环语句应用编程
一.实验目的 掌握格式化输出函数printf()和格式化输入函数scanf()的用法 掌握单个字符输出函数putchar()和单个字符输入函数getchar()的用法 理解结构化程序设计的三种基本结构 ...