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

61 阅读2分钟

在 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.xx