利器 | Java 接口自动化测试首选方案:REST Assured 实践 ,java接口自动化 _相关内容

大雄 385 2022-08-06


本文是关于java接口自动化-Java 接口自动化测试

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

REST Assured 官方的 README 第一句话对进行了一个优点的概述,总的意思表达的就是简单好用。那么 REST Assured 有哪些优点,又该如何使用呢?

用 Java 做接口自动化测试首选 REST Assured,具体原因如下:

  • 开源

  • 简约的接口测试 DSL

  • 支持 xml json 的结构化解析

  • 支持 xpath jsonpath gpath 等多种解析方式

  • 对 spring 的支持比较全面

添加 maven 依赖

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

我们对接口进行测试一般由三步曲:传参、发请求、响应结果断言,REST Assured给我们提供了清晰的三步曲,以given、when、then的结构来实现,基本写法如下:

//使用参数given().
    param("key1", "value1").
    param("key2", "value2").when().
    post("/somewhere").then().
    body(containsString("OK"))//使用X-Path (XML only) given().
    params("firstName", "John", "lastName", "Doe").when().
    post("/greetMe").then().
    body(hasXPath("/greeting/firstName[text()='John']"))

请求体body如下

{
  "password": "elcrD28ZSLLtR0VLs/jERA\u003d\u003d\n",
  "grant_type": "password",
  "scope": "server",
  "userType": 1,
  "username": "xxx"}

Request Header 如下:

Headers:    Authorization=Basic c3lzdGVtxxxRlbQ==
        Host=47.103.xxx.133
        Accept=*/*
        Content-Type=application/json; charset=ISO-8859-1

我们发送请求经常需要带有参数,使用 given() 就可以实现,当时当我们使用 given() 的时候发现其中有很多传参方法如下:

没错,在传参的方法中包含了 param、pathParam、queryParam 和 formParam,下面来研究下这几个传参方法的区别

  • param

  • 通常我们都会使用 given().param 方法来传参,REST Assured 会根据 HTTP 方法自动尝试确定哪种参数类型(即查询或表单参数),如果是 GET,则查询参数将自动使用,如果使用 POST,则将使用表单参数;

  • queryParam 和 formParam

  • 有时候在 PUT 或 POST 请求中,需要区分查询参数和表单参数时,就需要使用queryParam 和 formParam 方法了,具体写法如下:

given().
       formParam("formParamName", "value1").
       queryParam("queryParamName", "value2").when().
       post("/something")
  • pathParam
    使用given时指定请求路径的参数,这个方法很少用到,或者说我本人几乎没用到过(可能我的修行还不够,踩坑还太少~);具体写法如下:

given().
        pathParam("OAuth", "oauth").
        pathParam("accessToken", "token").when(). 
        post("/auth/{OAuth}/{accessToken}").then().
         ..
  • header/headers
    经常还需要在请求头中带入参数,这个时候就可以使用header或headers方法,写法如下:

given()
       .header("Authorization","Basic c3lzdGVtOxxxbQ==")
       .header("Host","47.xxx.xxx.133")
  • 或者用headers将多个参数写在一起:

given()
       .headers("Authorization","Basic c3lzdGVtxxx3RlbQ==","Host","47.xxx.xxx.133")
  • cookie
    有时候需要在请求中带入cookie,restassured提供了cookie方法来实现:

given()
      .cookie("c_a","aaaaaa")
      .cookie("c_b","bbbbbb"). ..
  • contentType
    经常还会设置contentType,最常见的就是application/json了,写法如下:

given().contentType("application/json"). ..//或者given().contentType(ContentType.JSON). ..
  • body
    在POST, PUT 或 DELETE请求中,我们经常还需要带上请求体body,写法如下:

given().body("{\n" +
                "\t\"password\": \"elcrD28xxxR0VLs/jERA\\u003d\\u003d\\n\",\n" +
                "\t\"grant_type\": \"password\",\n" +
                "\t\"scope\": \"server\",\n" +
                "\t\"userType\": 1,\n" +
                "\t\"username\": \"xxx\"\n" +
                "}")

也可以用request更为明确的指出是请求body:

given().request().body("{\n" +
                "\t\"password\": \"elcrD28xxxR0VLs/jERA\\u003d\\u003d\\n\",\n" +
                "\t\"grant_type\": \"password\",\n" +
                "\t\"scope\": \"server\",\n" +
                "\t\"userType\": 1,\n" +
                "\t\"username\": \"xxx\"\n" +
                "}")
  • 没有参数
    如果我们没有参数需要传递,也可以省略掉given():

get("/lotto").then().assertThat().body("lotto.lottoId", equalTo(5));
  • proxy
    有时候我们需要进行接口的调试,抓包是最常用的一种方式,rest-assured 提供了 proxy 方法,可以设置代理,写法如下:

given().proxy("127.0.0.1",8888). ..

实际运行结果:

  • when主要用来触发请求,在when后面接着请求URL:

given().when().post("http://47.103.xxx.133/auth/oauth/token"). ..
  • 前面在 given 中我们设置了很多请求参数,在 when 中也可以设置,只不过要注意的是在请求之前设置;这也比较好理解,如果再请求之后的话,参数都设置怎么发请求呢?

  given()
    .when()
        .contentType(ContentType.JSON)
        .headers("Authorization","Basic c3lzxxx3RlbQ==","Host","47.xxx.xxx.133")
        .request().body("{\n" +
            "\t\"password\": \"elcrD28ZSLLtR0VLs/jERA\\u003d\\u003d\\n\",\n" +
            "\t\"grant_type\": \"password\",\n" +
            "\t\"scope\": \"server\",\n" +
            "\t\"userType\": 1,\n" +
            "\t\"username\": \"qinzhen\"\n" +
            "}")
        .post("http://47.xxx.xxx.133/auth/oauth/token")
     . ..
  • 断言-then().body()
    then().body() 可以对响应结果进行断言,在 body 中写入断言:

.. post("http://47.xxx.xxx.133/auth/oauth/token")
   .then().statusCode(200).body("code",equalTo(1));

其中statusCode(200)是对状态码的断言,判断状态码是否为200; body(“code”,equalTo(1))是对返回体中的 code 进行断言,要求返回 code值为1 。

实操演示:
我们将上述的 given、when、then 结合起来看一下实际运行效果,这里在运行之前再提一个功能,我们可以在 when 和 then 后面加上.log().all(),这样在运行过程中就可以把请求和响应的信息都打印出来:

  • 获取响应-then().extract().body().path(“code”)
    我们可以在 then 后面利用 .extract().body() 来获取我们想要 body 的返回值,它们也可以直接接在断言后面,写法如下:

.. .then()
        .log().all().statusCode(200).body("code",equalTo(1))
        .extract().body().path("code");

实操演示:
演示前再来看一个新的功能,上面我们再写请求体 body 时时这样的:

body("{\n" +
    "\t\"password\": \"elcrD28ZxxxVLs/jERA\\u003d\\u003d\\n\",\n" +
    "\t\"grant_type\": \"password\",\n" +
    "\t\"scope\": \"server\",\n" +
    "\t\"userType\": 1,\n" +
    "\t\"username\": \"qinzhen\"\n" +
    "}")

看起来有点丑,改造一下;rest-assured 为我们提供了一个利用 HashMap 来创建json 文件的方法,先把要传的字段放入 hashmap 中,然后用 contentType 指明JSON 就可以了,具体写法如下:

HashMap map = new HashMap();map.put("password","elcrD28ZSLLtR0VLs/jERA\u003d\u003d\n");map.put("grant_type","password");map.put("scope","server");map.put("userType",1);map.put("username","xxx");given()
      .headers("Authorization","Basic c3lzdGVtxxxlbQ==","Host","47.xxx.xxx.133")
      .contentType(JSON)
      .body(map). ..

现在进行完整的请求,获取返回值 code 并打印:

HashMap map = new HashMap();map.put("password","elcrD28ZSLLtR0VLs/jERA\u003d\u003d\n");map.put("grant_type","password");map.put("scope","server");map.put("userType",1);map.put("username","xxx");Integer code = given()
    .headers("Authorization","Basic c3lzdGVtxxxlbQ==","Host","47.xxx.xxx.133")
    .contentType(JSON)
    .body(map).when()
    .log().all().post("http://47.xxx.xxx.133/auth/oauth/token").then()
    .log().all().statusCode(200).body("code",equalTo(1))
    .extract().body().path("code");System.out.println("返回code的值是:"+code);

运行结果:


关于REST Assured,这里仅仅算是初步认识。认识它的语法结构和功能,对于更多丰富的用法还需要慢慢探索研究,特别是断言的部分,是测试工程师最常用最终要的功能之一。REST Assured提供的完整断言手段,在后续文章中我们一起探讨。



步骤2:生成密钥

步骤2:生成密钥
本文介绍了通过VSM管理工具或调用Java接口来生成工作密钥的操作方法。通过VSM管理工具生成工作密钥 登录EVSM。在顶部菜单中,单击密钥管理。在密钥管理菜单下,单击对称密钥管理。在对称密钥管理对话框中,单击产生随机密钥。在产生随机...

步骤3:调用Java接口

本文档主要介绍了通过调用Java接口生成工作密钥和进行通用数据加解密的操作方法。整体流程 初始化SDK。具体内容请参见初始化SDK。调用Java接口生成工作密钥、进行数据加密和解密。具体内容,请参见调用Java接口生成工作密钥、调用Java接口...

在Android App中接入HTML5滑块验证

} } 在Activity文件中,添加自定义Java接口(testJsInterface),并定义getSlideData方法获取滑块数据。import android.webkit.JavascriptInterface;public class testJsInterface {@JavascriptInterface public void getSlideData(String ...

发布 SOFARPC 服务

interface:该属性用于确定一个服务,属性值为:命名空间包名+Java 接口名。unique-id:如果同一个接口有两个不同的实现,而这两个不同的实现都需要发布成 SOFA 的 RPC 服务,则可以在发布服务的时候加上一个 unique-id 属性来进行区分。...

智能流量测试Dubbo服务

智能流量测试功能通过对微服务应用接口的流量录制,并自动生成对应的自动化回归测试用例和服务压测场景,帮助您轻松完成模拟真实请求进行服务压测和零编码成本的接口自动化回归。本文介绍如何录制Dubbo服务的流量和如何将录制流量自动化...

智能流量测试Spring Cloud服务

智能流量测试功能通过对微服务应用接口的流量录制,并自动生成对应的自动化回归测试用例和服务压测场景,帮助您轻松完成模拟真实请求进行服务压测和零编码成本的接口自动化回归。本文介绍如何录制Spring Cloud服务的流量和如何将录制流量...

智能流量测试服务

智能流量测试功能通过录制微服务应用接口的流量,并自动生成对应的自动化回归测试用例和服务压测场景,帮助您模拟真实请求进行服务压测并以零编码成本完成接口自动化回归。本文介绍如何录制Spring Cloud服务的流量和如何将录制流量自动生成...

基于弹性网卡操作完成事件实现业务自动化处理

本文以Java代码为例,介绍基于弹性网卡操作完成事件实现业务自动化处理的相关操作。背景信息 阿里云云监控支持在设置事件通知时关联消息服务MNS。当您通过云监控关联了弹性网卡操作完成事件和消息服务MNS时,可以同步将事件通知发送至消息...

SDK下载

V1.15 Linux Linux(C++)Linux(Java)Linux(C++)接口说明 Linux(Java)接口说明 V1.18.16(C++)V1.18.16(Java)无 说明 目前Electron框架只支持打包为Windows或Mac版本。开通RTC服务后默认不支持微信小程序端能力。如果您需要使用小...

产品对比

修改过的配置自动推送到监听的客户端 修改过的配置自动推送到监听的客户端 API接口 基于 RESTful API,同时支持 Java Native接口,Spring Cloud 接口,和其他语言类接口 基于 RESTful API 和 Spring Cloud 规范,同时也支持其他语言客户端...

Spring集成

本文介绍如何在Spring框架下用消息队列RocketMQ版收发消息。...Spring框架下支持的更多配置参数请参见Java SDK接口和参数说明。Demo下载 您可以通过以下链接获取相关Demo:spring/java-spring-demo springboot/java-springboot-demo

运行安全命令示例

本文为您介绍如何在MaxCompute客户端上使用Java SDK接口运行安全相关的命令。前提条件 您需要完成以下操作:准备IntelliJ IDEA开发工具,请参见安装Studio。配置MaxCompute Studio连接MaxCompute项目空间,请参见创建MaxCompute项目连接。...

Java SDK

本文介绍如何使用阿里云智能语音服务提供的Java SDK,包括SDK的安装方法及SDK代码示例。前提条件在使用SDK之前,请先阅读接口说明,详情请参见接口说明。下载安装从Maven服务器下载最新版本SDK。groupId>...

Java SDK

本文介绍如何使用阿里云智能语音服务提供的Java SDK,包括SDK的安装方法及SDK代码示例。注意事项在使用SDK前,请先阅读接口说明,详情请参见接口说明。从2.1.0版本开始原有nls-sdk-short-asr更名为nls-sdk-recognizer,升级时需确认已删除...

Java SDK使用说明

本文介绍官方Java SDK接口详情。同时,以字符串输入输出和TensorFlow输入输出为例,提供了使用Java SDK进行服务调用的完整程序示例。添加依赖包 使用Java编写客户端代码时,需要使用Maven管理项目。因此,您必须在pom.xml文件中添加客户端...

Java SDK

本文介绍如何使用阿里云智能语音服务提供的Java SDK,包括SDK的安装方法及SDK代码示例。前提条件在使用SDK之前,请先阅读接口说明,详情请参见接口说明。从2.1.0版本开始原有nls-sdk-long-asr更名为nls-sdk-transcriber。升级时需确认已...

账号集成

数字工厂账号和权限集成详细请查看SaaS应用租户对接 查询 获取全部角色列表,接口说明java demoimport com.alibaba.cloudapi.sdk.model.ApiResponse;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONArray;import ...

Java SDK

部分超高清场景声音(如“知琪”等)暂不支持通过实时接口(Java SDK及C++ SDK)调用,只支持RESTful API异步调用,具体请详见接口说明中声音类型支持接口类型列的描述。下载安装从Maven服务器下载最新版本SDK,下载nls-sdk-java-demo.zip...

开发HSF应用(Pandora Boot)

int 无 spring.hsf.serialize-type 否 服务的全局序列化类型,Hessian或者Java,还可以使用spring.hsf.serialize-types.<完整的服务接口名>=<序列化类型>单独为某服务设置序列化类型。String 无 说明 全局配置参数可在Pandora Boot应用的...

开发HSF应用(Pandora Boot)

int 无 spring.hsf.serialize-type 否 服务的全局序列化类型,Hessian或者Java,还可以使用spring.hsf.serialize-types.<完整的服务接口名>=<序列化类型>单独为某服务设置序列化类型。String 无 说明 全局配置参数可在Pandora Boot应用的...

Instance Logview示例

MaxCompute Java SDK提供Logview接口,详情请参见SDK Java Doc。接口说明Instance i=odps.instances().get("<instance_id>");String logviewUrl=odps.logview().generateLogView(i,7*24);参数说明:Instance:要查看的Instance名称。hours...

机器人流程自动化RPA

阿里云RPA(机器人流程自动化)通过模拟人的界面操作,自动完成跨系统、跨平台重复有规律的工作流任务,成倍提升人的工作效率。阿里云RPA诞生于2011年(原码栈),目前已在零售、政务、制造、保险、金融、医疗等领域得到了广泛应用。\n点击...

事件概述

您可以通过Java SDK调用事件接口发布事件。Java SDK提供以下事件接口:PutEvents

启动规则

本示例介绍使用Alibaba Cloud SDK for Java调用StartRule接口启动指定的规则。前提条件 请在pom.xml文件中增加以下依赖,准确的SDK版本号,参见阿里云开发工具包(SDK)。modelVersion>4.0.0</modelVersion><groupId>java.demo...

获取视频播放凭证

本示例介绍使用Alibaba Cloud SDK for Java调用GetVideoPlayAuth接口获取视频播放凭证。前提条件在调用GetVideoPlayAuth接口前,请确保。已经开通了视频点播服务。已完成域名绑定。已上传一个视频并获取到该视频的ID(videoId)。安装视频...

删除分组

本示例介绍使用Alibaba Cloud SDK for Java调用DeleteDeviceGroup接口删除分组。前提条件 请在pom.xml文件中增加以下依赖,准确的SDK版本号,参见阿里云开发工具包(SDK)。modelVersion>4.0.0</modelVersion><groupId>java.demo...

删除规则

本示例介绍使用Alibaba Cloud SDK for Java调用DeleteRule接口删除指定的规则。前提条件 请在pom.xml文件中增加以下依赖,准确的SDK版本号,参见阿里云开发工具包(SDK)。modelVersion>4.0.0</modelVersion><groupId>java.demo...

停止规则

本示例介绍使用Alibaba Cloud SDK for Java调用StopRule接口指定的规则。前提条件 请在pom.xml文件中增加以下依赖,准确的SDK版本号,参见阿里云开发工具包(SDK)。modelVersion>4.0.0</modelVersion><groupId>java.demo...

查询呼叫状态

本示例介绍使用Alibaba Cloud SDK for Java调用QueryCallStatus接口查询呼叫状态。在业务中使用已创建的绑定关系之前,建议通过接口QueryCallStatus查询呼叫状态,以免呼叫关系异常,影响实际业务。前提条件在调用QueryCallStatus接口前,...

查询分组详情

本示例介绍使用Alibaba Cloud SDK for Java调用QueryDeviceGroupInfo接口查询分组详情。前提条件 请在pom.xml文件中增加以下依赖,准确的SDK版本号,参见阿里云开发工具包(SDK)。modelVersion>4.0.0</modelVersion><groupId>...

获取实例状态

本示例介绍如何使用Alibaba Cloud SDK for Java调用DescribeInstanceStatus接口获取实例状态。前提条件 在使用本教程之前,请确保已完成以下操作:使用Alibaba Cloud SDK for Java,您需要一个阿里云账号和访问密钥(AccessKey)。请在阿里...

查询规则信息

本示例介绍使用Alibaba Cloud SDK for Java调用GetRule接口查询指定规则的详细信息。前提条件 请在pom.xml文件中增加以下依赖,准确的SDK版本号,参见阿里云开发工具包(SDK)。modelVersion>4.0.0</modelVersion><groupId>java....

查询异常事件列表

本示例介绍使用Alibaba Cloud SDK for Java调用DescribeSuspEvents接口来获取主机异常事件。前提条件请在pom.xml文件中增加以下依赖,准确的SDK版本号,请参见阿里云开发工具包(SDK)。modelVersion>4.0.0</modelVersion>...

查询转码配置

本示例介绍使用Alibaba Cloud SDK for Java调用DescribeLiveStreamTranscodeInfo接口查询转码配置信息。前提条件 请在pom.xml文件中增加以下依赖,准确的SDK版本号,请参见 阿里云开发工具包(SDK)。modelVersion>4.0.0...

获取磁盘信息

本示例介绍如何使用Alibaba Cloud SDK for Java调用DescribeDisks接口获取磁盘信息。前提条件 在使用本教程之前,请确保已完成以下操作:使用Alibaba Cloud SDK for Java,您需要一个阿里云账号和访问密钥(AccessKey)。请在阿里云控制台...

修改分组信息

本示例介绍使用Alibaba Cloud SDK for Java调用UpdateDeviceGroup接口修改分组信息。前提条件 请在pom.xml文件中增加以下依赖,准确的SDK版本号,参见阿里云开发工具包(SDK)。modelVersion>4.0.0</modelVersion><groupId>java....

查询分组中设备列表

本示例介绍使用Alibaba Cloud SDK for Java调用QueryDeviceListByDeviceGroup接口查询分组中设备列表。前提条件 请在pom.xml文件中增加以下依赖,准确的SDK版本号,参见阿里云开发工具包(SDK)。modelVersion>4.0.0...

删除审核回调

本示例介绍使用Alibaba Cloud SDK for Java调用DeleteLiveDetectNotifyConfig接口删除审核回调。前提条件请在pom.xml文件中增加以下依赖,准确的SDK版本号,请参见阿里云开发工具包(SDK)。modelVersion>4.0.0</modelVersion>...

查询审核回调URL

本示例介绍使用Alibaba Cloud SDK for Java调用DescribeLiveDetectNotifyConfig接口查询审核回调URL。前提条件请在pom.xml文件中增加以下依赖,准确的SDK版本号,请参见阿里云开发工具包(SDK)。modelVersion>4.0.0...

以上就是小编为大家整理的java接口自动化-Java 接口自动化测试



版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:接口自动化,Jmeter 接口自动化脚本结构进阶
下一篇:从0到1开发自动化测试框架,接口自动化测试很难?带你从0到1入门接口自动化测试【0基础也能看懂系列】
相关文章

 发表评论

暂时没有评论,来抢沙发吧~