API自动化测试方式非常多,可谓百花齐放,各种做法有各自的优势,那么今天我们简单介绍一种,通过Rest Assured 和TestNG 结合实现API自动化测试。

环境搭建

新建个maven 工程,直接在pom文件配置如下,导入Rest Assured和TestNG相应的包,可以根据实际情况导入最新版本。

        <!-- https://mvnrepository.com/artifact/io.rest-assured/rest-assured --><dependency><groupId>io.rest-assured</groupId><artifactId>rest-assured</artifactId><version>3.0.5</version></dependency><!-- https://mvnrepository.com/artifact/org.testng/testng --><dependency><groupId>org.testng</groupId><artifactId>testng</artifactId><version>6.11</version></dependency>

Demo 演示

Get Demo 演示

这里我们以简书首页的推荐作者API为例,该API为Get请求,请求地址和参数:http://www.jianshu.com/users/recommended?seen_ids=&count=5&only_unfollowed=true

那么我们用Rest Assured 要模拟这个请求,
首先我们需要先导入静态方法:

import static io.restassured.RestAssured.*;

然后我们编写我们的Case:

    @Test()public void getHttpTest() {Response response = given().get("http://www.jianshu.com/users/recommended?seen_ids=&count=5&only_unfollowed=true");// 打印出 response 的bodyresponse.print();}

https协议Demo

假设https协议,我们以豆瓣搜索图书API为例,详细API如下图所示:

豆瓣图书查询

那么上个case我们把参数直接跟在URL后面发起请求,下面我们把参数剥离出来,使用.params(“key”,"value","key","value"....),同时因为是https我们需要加上ssl的配置,让所有请求支持所有的主机名:

    @Test()public void getHttpsTest() {Response response = given()// 配置SSL 让所有请求支持所有的主机名.config((RestAssured.config().sslConfig(new SSLConfig().relaxedHTTPSValidation()))).params("q", "自动化测试", "start", 0, "count", 2).get("https://api.douban.com/v2/book/search");// 打印出 response 的bodyresponse.print();}

请求的参数除了可以用.params(“key”,"value","key","value"....)把所有参数都放在parames()里面,也可以用parame("key","value")形式。

    @Test()public void getHttpsTest2() {Response response = given().config((RestAssured.config().sslConfig(new SSLConfig().relaxedHTTPSValidation()))).param("q", "自动化测试").param("start", 0).param("count", 2).get("https://api.douban.com/v2/book/search");// 打印出 response 的bodyresponse.print();}

Post Demo

POST请求我们以登陆API为例,
请求方法:POST
协议:HTTP
请求地址:http://XXX.XXXX.com/Home/Login
请求参数:UserName=xxx&Password=********&CheckCode=&Remember=false&LoginCheckCode=7505
请求Content-Type类型为:application/x-www-form-urlencoded
那么实现如下:

    @Testpublic void postTest2() {Response response = given()// 设置request Content-Type.contentType("application/x-www-form-urlencoded")// 请求参数 放body.body("UserName=XXXX&Password=XXXXXX&CheckCode=&Remember=false&LoginCheckCode=7505")// POST 请求.post("http://XXXX.XXXX.com/Home/Login");response.print();}

当然如果请求Content-Type类型是:application/x-www-form-urlencoded,我们也可以直接用param()或者params()管理,但是如果是
application/json 则只能用body()管理参数。

    @Testpublic void postTest3(){Response response = given().contentType("application/x-www-form-urlencoded").param("CheckCode", "").param("LoginCheckCode", "3719").param("Password", "XXXXX").param("Remember", "true").param("UserName", "XXXXX").post("http://XXXX.XXXXX.com/Home/Login");response.print();}

设置header,cookie

header和cookie的设置类似param,存在header()、headers()、cookie()、cookies()方法,使用也跟param类似:

        Response response = given().cookie("cookie","value").cookies("cookiename1", "value1", "cookiename2", "value2").header("Accept-Encoding:", "gzip, deflate").headers("header1","value1","header2","value2").get("XXXXXXX");

获取Response 状态码:StatusCode

获取状态码,返回int类型:

response.getStatusCode();

获取Response Cookies

获取具体的某个cookies:

response.getCookie("cookiesName")

获取所有的cookies,返回一个map:

Map cookies = response1.getCookies();

Response headers 常用操作

  1. 获取所有headers:
Headers headers = response.getHeaders();
  1. 获取指定header:
response.getHeader("header name");
// 等同上面方法
Headers headers = response.getHeaders();
headers.get("header name");
  1. 判断某个header是否存在,返回boolean类型
Headers headers = response.getHeaders();
headers.hasHeaderWithName("XXX")
  1. 判断header是否为空
Headers headers = response.getHeaders();
headers.exist()

获取Response body

获取Response body,并转成String类型:

response.getBody().asString()

完整例子跟如下JSON解析一起给出。

解析JSON

Rest Assured 自带支持对JSON、xml的解析,例如我们还是以豆瓣图书查询API为例,假设我们请求参数中q= “自动化测试”,start=0,count=5那么我们模拟这个请求并做简单JSON解析:

    @Testpublic void jsonParsed() {Response response = given().config((RestAssured.config().sslConfig(new SSLConfig().relaxedHTTPSValidation()))).params("q", "自动化测试", "start", 0, "count", 5).get("https://api.douban.com/v2/book/search");// 打印出 response 的bodyresponse.print();int statusCode = response.getStatusCode();System.out.println("statusCode:" + statusCode);// 获取Response 的所有 headers 并输出Headers headers = response.getHeaders();System.out.println(headers.toString());// 获取Response中header名为Content-Type的值String contentType = response.getHeader("Content-Type");System.out.println("contentType:" + contentType);// 等同上面方法System.out.println(headers.get("Content-Type"));// 校验某个Header 是否存在System.out.println(headers.hasHeaderWithName("fasdfaf"));System.out.println(headers.hasHeaderWithName("Server"));// 如果Response 的headers不为空则返回trueSystem.out.println(headers.exist());Map<String, String> cookiesMap = response.cookies();for (String key : cookiesMap.keySet()) {System.out.println(key + ":" + cookiesMap.get(key));}System.out.println(response.cookie("bid"));// 把Response 的body转成string类型System.out.println(response.getBody().asString());int count = response.jsonPath().getInt("count");System.out.println("count:" + count);// 获取所有的 subtitleArrayList<String> subtitles = response.jsonPath().get("books.subtitle");for (int i = 0; i < subtitles.size(); i++) {System.out.println(subtitles.get(i));}// 获取特定某个的subtitleString subtitle = response.jsonPath().get("books.subtitle[0]");System.out.println(subtitle);// 获取倒数第二个的subtitleString subtitle1 = response.jsonPath().get("books.subtitle[-2]");System.out.println(subtitle1);// 获取特定tags底下的所有titleArrayList<String> tagTitle = response.jsonPath().get("books.tags[2].title");for (int i = 0; i < tagTitle.size(); i++) {System.out.println(tagTitle.get(i));}// 获取所有的 titleArrayList<ArrayList<String>> tagTitles = response.jsonPath().get("books.tags.title");for (int i = 0; i < tagTitles.size(); i++) {for (int j = 0; j < tagTitles.get(i).size(); j++) {System.out.println(tagTitles.get(i).get(j));}System.out.println("---------------------");}// 获取Response json里面所有title = "Selenium 2自动化测试实战"的titleString title = response.jsonPath().get("books.title.findAll{title ->title==\"Selenium 2自动化测试实战\"}").toString();System.out.println(title);// 获取Response json中 1< numRaters <=20的所有 numRatersString numRaters = response.jsonPath().get("books.rating.numRaters.findAll{numRaters -> numRaters>1 && numRaters<=20}").toString();System.out.println(numRaters);// 获取Response json种title = "基于Selenium 2的自动化测试"对应的 authorString title2 = response.jsonPath().get("books.findAll{it.title==\"基于Selenium 2的自动化测试\"}.author").toString();System.out.println(title2);}

校验Response 是否达到预期

Rest Assured提供了类似hasITems ,is,equalTo等静态方法供使用,使用时先导入方法:

import static org.hamcrest.CoreMatchers.hasItems;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.core.IsEqual.equalTo;
    @Testpublic void testDemo1() {Response response = given().config((RestAssured.config().sslConfig(new SSLConfig().relaxedHTTPSValidation()))).params("q", "自动化测试", "start", 0, "count", 5).expect()// 判断 title是否包含了 自动化 和 自动化测试.body("books.tags[2].title", hasItems("自动化", "自动化测试"))// 判断 count 值是否为 5.body("count", is(5))// 判断 publisher 值是否为 "电子工业出版社".body("books.publisher[0]", is("电子工业出版社"))// 判断 title 是否等于 5.body("count", equalTo(5)).when().get("https://api.douban.com/v2/book/search");// 打印出 response 的bodyresponse.print();}

尽管Rest Assured 提供了校验方法,但是在实际API自动化测试过程中,因为往往需要校验的字段非常多,建议还是直接先把要校验的JSON字段解析出来,再通过TestNG提供的Assert类进行校验。


补充个例子

Web API 里面非常多的API发起请求都需要在用户登陆下才能发起,而判断用户是否登录往往就是去判断cookies,所以如果遇到这类问题,只需要在需要模拟的API中设置cookies为登录API生成的cookies便可。
例如下demo,第二个请求通过的前提是拿到第一个请求的cookies,那么我们就把第一个请求的response中的所有cookies放到第二个请求作为request:

    @Testpublic void postHttpsTest3() {Response response1 = given().contentType("application/x-www-form-urlencoded").body("UserName=XXXX&Password=XXXXX&CheckCode=&Remember=false&LoginCheckCode=7505").post("http://XXXX.XXXX.com/Home/Login");response1.print();// 获取reponse中所有的cookiesMap cookies = response1.getCookies();Response response2 = given()// 写入第一个请求的cookies.cookies(cookies).contentType("application/x-www-form-urlencoded").param("ActionName", "").param("CurrentUserNo", "XXXXX").post("http://XXXX.XXXXX.com/Home/IsCurrentAccountValid");response2.print();}

更多帮助

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走

这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。希望对大家有所帮助…….

这些都在下方我的微信公众号里免费获取~

接口自动化测试 --- Rest Assured相关推荐

  1. 利器 | Java 接口自动化测试首选方案:REST Assured 实践 (一)

    在 REST Assured 的官方 GitHub 上有这样一句简短的描述: Java DSL for easy testing of REST services 简约的 REST 服务测试 Java ...

  2. jmeter中没有sampler_JMeter 接口自动化测试篇 29

    接口自动化测试框架,初始设计(四) 写着写着觉得JMeter 常规的使用和框架已基本快完成了,如果大家还需要更深入的了解JMeter 可以私信我,我这个专题内容相对还是有些局限,JMeter中的内容还 ...

  3. 给接口自动化测试框架增色,实现企业微信测试报告

    作者在新项目中搭建了python+requests+unittest+HTMLTestRunner接口自动化测试框架,通过修改配置文件实现环境隔离,一份脚本即可在不同的环境执行接口测试用例. 但是没有 ...

  4. 清华学长请授接口自动化测试进阶攻略

    为什么要做接口自动化 相对于UI自动化而言,接口自动化具有更大的价值. 为了优化转化路径或者提升用户体验,APP/web界面的按钮控件和布局几乎每个版本都会发生一次变化,导致自动化的代码频繁变更,没有 ...

  5. 接口自动化测试的几个阶段

    接口自动化测试的几个阶段 原文地址http://blog.csdn.net/huazhongkejidaxuezpp/article/details/52825364 根本目标 测试环境中,保证新增接 ...

  6. 日志按照天自动输出_性能测试和接口自动化测试

    测试的发展方向大体是4种:功能业务测试.性能测试.测试开发.安全测试 (1)功能测试也就是以业务测试为重点,测试过程中可以使用一些开发语言如Java.Python写自动化的脚本辅助业务测试. (2)性 ...

  7. 对接接口文档_接口自动化测试框架设计思路

    接口自动化测试--框架设计思路 1 前言 之前文章跟大家分享了一下自己在接口自动化测试中进行测试准备的一些相关知识点,接下来本篇文章详细分享一下接口自动化框架设计的思路总结,希望能对初次探索接口自动化 ...

  8. python自动测试p-使用python+requests实现接口自动化测试

    这两天一直在找直接用python做接口自动化的方法,在网上也搜了一些博客参考,今天自己动手试了一下. 一.整体结构 上图是项目的目录结构,下面主要介绍下每个目录的作用. Common:公共方法:主要放 ...

  9. python 自动化-Python 接口自动化测试

    一.基础准备 1. 环境搭建 工欲善其事必先利其器,废话不多说.我们先开始搭建环境. # 创建项目目录 mkdir InterfaceTesting # 切换到项目目录下 cd InterfaceTe ...

  10. python自动化测试视频百度云-Python接口自动化测试视频教程下载

    Python接口自动化测试视频教程下载 课程介绍: 此套Python接口自动化测试视频教程适合入门接口测试和学习python+requests自动化的学员学习,教程对http协议.fiddler抓包与 ...

最新文章

  1. Linux内存、Swap、Cache、Buffer详细解析
  2. hdu1787-GCD Again
  3. vc采集网页内指定frame框架下所有元素-再升级版
  4. 抽象工厂模式_设计模式系列—抽象工厂模式
  5. sap客户主数据bapi_【SD系列】SAP SD模块-创建供应商主数据BAPI
  6. 记一次RAID阵列的迁移经历
  7. mysql多表连接的几种写法
  8. python求两坐标距离_如何使用Python已知两坐标求距离?
  9. 使用srvany.exe把程序安装成windows服务
  10. 《老路用得上的商学课》91-95学习笔记
  11. 计算机房电磁辐射防护,环境电磁辐射监测仪器要求和标准监测方法
  12. android 系统级闹铃,Android 设置系统闹铃和日历
  13. 异常解决java.lang.ClassNotFoundException: org.springframework.boot.actuate.endpoint.PublicMetrics
  14. ucos 和uclinux的区别及各自的特点
  15. 我的世界java甘蔗机_萌新如何建造我的世界自动化甘蔗收割机攻略
  16. python msp_MSP系统使用python语言实现接口自动化
  17. android动态设置textview的id,动态调整TextView的Gravity
  18. DedeCMS插件自动采集发布文章插件
  19. python利用公式计算Π(pi)的值
  20. 【资源分享】少女爱上姐姐汉化版游戏下载,附图文攻略

热门文章

  1. HTML颜色名称和颜色代码表
  2. 三分钟告诉你什么是三层交换机!
  3. “十步杀一人,千里不留行。事了拂衣去,深藏功与名。”
  4. Spring Cloud(十二):Spring Cloud Zuul 限流详解(附源码)(转)
  5. Python爬取新东方在线网站大学英语六级词汇
  6. lol英雄全皮肤爬取
  7. 2011 9 11最新过QQ游戏检测Cheat Engine(CE)搜索数据
  8. 输电线缺陷检测 计算机工程与设计,小波去噪和混沌理论应用于输电线缺陷检测-计算机工程与应用.pdf...
  9. 高中英语语法(005)-五大句型(下)
  10. L.G.ALEXANDER 访谈录(ZT)