用RestAssured实现代码接口测试|响应提取|Gpath表达式

目录

一、REST-assured简介

1、Maven的pom.xml添加 REST-assured 依赖坐标

 2、语法格式——三段式结构——串联调用

二、具体请求

1、请求头&打印响应

2、get请求参数

3、post请求参数(四种方式的Content-Type和body不同)

——contentType("application/x-www-form-urlencoded")

2. json传参——contentType("application/json")

3. xml参数类型——contentType("application/xml")

4. 大型文件的传输/上传文件

—— contentType("multipart/form-data").multiPart(new File("D:\match.png")).

4、put/patch ——一般也用body传参

5、delete请求——用queryParam

三、获取响应

四、Gpath响应体数据提取


一、REST-assured简介

REST-assured是Github上一个开源项目,基于httpclient;它的语法非常简洁,是一种专为测试 REST API 而设计的测试框架

基本使用

1、Maven的pom.xml添加 REST-assured 依赖坐标


    io.rest-assured
    rest-assured
    4.2.0
    test
 2、语法格式——三段式结构——串联调用

given(). xxx .when(). xxx .then().xxx

类似于行为驱动开发(Behaviour Driven Development-BDD)中的定义的结构 Given-When-Then,

Given:在某场景下,When:发生什么事件,Then:产生了什么结果。

而 REST-Assured 借鉴了这一套描述可以使得语法更加简洁:

  • given 设置测试预设(包括请求头、请求参数、请求体、cookies 等等)

  • when 所要执行的操作(GET/POST 请求等等)

  • then 解析结果、断言

    response = RestAssured.
          given().
              log().all().//打印所有的请求数据
              headers(mapHeaders).
              body(requestInputParams).
          when().
             【请求方式post/get...】(requestUrl).
          then().
              log().all().//打印所有的响应数据
              extract().response();//获取响应

二、具体请求

1、请求头&打印响应

请求头:header(具体请求头)、headers(map)、具体请求头

打印响应:

  •         log().all()——打印出响应的全部内容
  •         log().headers()——打印响应头
  •         log().body——打印响应体
given().
   		header("Content-Type","application/json").
       	contentType("application/json").  
        //————contentType可以在外面直接写,也可以放到header里面
       	//多个请求头可以用headers,map键值对.   
        body(jsonData).
when(). //操作 发送的请求
        post("http:...").
then().
        log().all()——打印出响应的全部内容
        log().headers()——打印响应头
        log().body——打印响应体

2、get请求参数

方式一:直接在URL地址后面拼接参数,多个参数用"&"连接

方式二:通过queryParam方法添加参数——queryParam表示查询参数,可以参考postman

方式三:通过queryParams方法添加参数,Map结果,把参数json转成Map

given().
   queryParam("mobilephone","13323234545").
   queryParam("password","123456").
  //queryParams("phone","13323234545","password","123456").               
when().
   get("http://httpbin.org/get").
then().
   log().body();

3、post请求参数(四种方式的Content-Type和body不同)

1. form表单参数类型——参数是键值对形式,支持&(符号)拼接⚠️

——contentType("application/x-www-form-urlencoded")

——表单格式是由键值对组成。键和值之间用=。多个键值对之间用&。例如:name=ZhangSan&age=16

given().
   contentType("application/x-www-form-urlencoded").
   body("hello=1111&world=2222")
when().
   post("http://httpbin.org/post").
then().
   log().body();
2. json传参——contentType("application/json")
3. xml参数类型——contentType("application/xml")
4. 大型文件的传输/上传文件
—— contentType("multipart/form-data").multiPart(new File("D:\match.png")).

我们传送大容量的数据到服务端时,我们通常使用 multipart 表单数据技术。

rest-assured提供了一个叫做multiPart 的方法可以让我们指定文件(file)、包括json文件,字节数组(byte-array)、输入流或者是上传文件,上传文件不能用body

given().
   contentType("multipart/form-data").
   multiPart(new File("D:\\match.png")).
when().
   post("http://httpbin.org/post").
then().
   log().body();
4、put/patch ——一般也用body传参

三、获取响应

extract().response()

  • time——获取接口请求响应时间,单位是毫秒

  • statusCode——获取http状态码

  • getHeader("Content-Type")——获取响应头某一个字段对应的值

  • getHeaders——获取相应头

  • jsonPath().get(XXX)——获取响应体信息(Json格式)

Response res=
given().
   contentType(ContentType.JSON).
   body(jsonData).
when().
   post("http://httpbin.org/post").
then().
   log().all().
   extract().response();
    System.out.println(res.statusCode());//获取http状态码
    System.out.println(res.time());//获取请求的响应时间,单位是毫秒
    System.out.println(res.getHeader("Content-Type"));//application/json;charset=UTF-8

四、Gpath响应体数据提取

有时我们需要获取响应头中的一些信息,比如Token。也可以通过Gpath解析响应体某个值,层级提取。

需要注意的是REST-Assured中的json响应提取是为Groovy's GPath语法(简称GPath),而不是 Jayway's JsonPath语法。

简单来说GPath是一种路径表达式语言,类似于xpath,GPath不仅可以应用于XML,还可以应用于嵌套的层级结构(比如Json、Html)。Gpath相比较 Jayway's JsonPath语法更为简洁。

  • 提取json————响应.jsonPath().get(Gpath表达式);
  • 提取xml ————响应.xmlPath().get(Gpath表达式);
  • 提取html————响应.htmlPath().get(Gpath表达式);

代码:提取html为例,用到的是Gpath的绝对表达式,如果层级比较多的时候一般使用相对路径

public void getHtmlData(){
    Response res = RestAssured.
            given().
            when().
                get("https://www.baidu.com/").
            then().
                log().all().
                extract().response();
    //获取百度title标签的文本值
    String titleStr = res.htmlPath().get("html.head.title");
    System.out.println(titleStr);
    //获取标签的属性值 .@属性名---获取属性的值
    String metaStr = res.htmlPath().get("html.head.meta[2].@name");
    System.out.println(metaStr);
    //获取第二个meta的content属性
    String contentStr = res.htmlPath().get("html.head.meta[1].@content");
    System.out.println(contentStr);
}

你可能感兴趣的:(接口测试自动化,测试工具,模块测试,测试用例)