REST-保证的HTTP POST和PUT实例

177 阅读5分钟

学习制作 在自动测试中使用REST-assured的HTTP POST和PUT请求.我们将学习不同的方法来定制请求体、头文件和认证。此外,我们还将学习验证API响应。

目录

  1. 1.一个简单的例子
  2. 2.附加POST请求正文
  3. 3.添加请求头和查询参数
  4. 4.发送验证信息
  5. 5.验证响应状态和正文
  6. 6.记录和提取响应数据
  7. 7.结语

1.一个简单的例子

在深入研究之前,让我们从一个简单的HTTP POST例子开始,介绍测试中涉及的基本API。下面是一个POST API和请求体。

HTTP POST /users

{
    "name": "lokesh",
    "email": "admin@howtodoinjava.com"
}

一个典型的API调用,包括发送请求体、头文件和验证响应数据,如下所示。

@Test
public void createUserWithCustomObject_thenSuccess() throws JSONException {
    given()
        .body(new User("lokesh", "admin@howtodoinjava.com"))
        .header(new Header("x-custom-header", "value"))
        .contentType("application/json")
    .when()
        .post("/users")
    .then()
        .statusCode(201)
        .body("id", notNullValue())
        .body("name", equalTo("lokesh"))
        .body("email", equalTo("admin@howtodoinjava.com"));
}

2.附加POST请求体

REST-assured支持以多种方式发送请求体。一些最常用的方式是建立JSONObject,解析一个自定义对象或直接从文件中发送请求正文。我们也可以模仿表单提交。

2.1.使用JSONObject

JSONObject来自JSON-java库,REST-assured内部支持它。JSON-java支持将JSON文档解析为Java对象,并从Java类中生成新的JSON文档。它还可以在JSON和XML、HTTP头信息、Cookies和CDL之间转换。

为了建立JSONObject,我们使用它的put() 方法,类似于Java中的Map,它需要一个键和值可以是任何基元、对象、集合甚至是地图。通过传递Map和集合,我们可以建立任何嵌套的JSON结构。

JSONObject requestParams = new JSONObject();
requestParams.put("name", "lokesh");
requestParams.put("email", "admin@howtodoinjava.com");

given()
    .body(requestParams.toString())
    .contentType("application/json")
.when()
    .post("/users")
.then()
    .statusCode(equalTo(201));

2.2.使用自定义对象

我们可以向*body()*方法传递一个自定义POJO。

User user = new User("lokesh", "admin@howtodoinjava.com");

given()
    .body(user)
    .contentType("application/json")
.when()
    .post("/users")
.then()
    .statusCode(equalTo(201));

用户是一个没有任何注释的简单POJO。

public class User {
  private String name;
  private String email;

  //Setters, getters and constructors
}

为了定制序列化反序列化,REST-assured支持来自GSONJAXBJackson、Faster Jackson和Eclipse Yasson(JSON-B)的对象映射器。例如,我们可以在POJO中使用Gson注解,然后用GsonBuilder构建GsonObjectMapperFactory,如下所示。

@BeforeAll
public static void setup() {

baseURI = "https://ROOT_URL/";

RestAssured.config = RestAssuredConfig.config()
    .objectMapperConfig(objectMapperConfig().gsonObjectMapperFactory(

        new GsonObjectMapperFactory() {
          @Override
          public Gson create(Type type, String s) {
            return new GsonBuilder()
                .setFieldNamingPolicy(LOWER_CASE_WITH_UNDERSCORES)
                .create();
          }
        }
    ));
}

2.3.提交文件或输入流

*body()*接受类型为java.io.FileInputStream 的参数。我们可以在API请求中直接传递一个JSON文件。它有助于防止从POJO中解析出正确的JSON文档的复杂性。在技术上效率不高的测试人员中,它有时是首选方式。

{
    "name": "lokesh",
    "email": "admin@howtodoinjava.com"
}
given()
    .body(new File("createUser.json"))
    .contentType("application/json")
.when()
    .post("/users")
.then()
    .statusCode(equalTo(201));

3.添加请求头信息和查询参数

使用*accept()contentType()*方法来传递媒体类型信息。

given()
    .body(...)
    .accept("application/json")
    .contentType("application/json")
    ...

要发送查询参数,使用*queryParam()*方法。

given()
    .body(...)
    .queryParam("access-token", "abcd")
    ...

4.发送验证信息

传递认证信息取决于API所支持的认证方案。REST-assured支持几乎所有种类的认证,包括OAuth、OAuth2、头文件甚至表单提交。使用*oauth2()*来传递OAuth2认证令牌。

given()
    .auth().preemptive().oauth2(accessToken)
    ...

对于使用头文件添加认证,AuthFilter ,而不是普通的过滤器或直接头文件,因为在测试不安全的API时,做*given().auth().none()*时,AuthFilter被移除。

given().
    filter((requestSpec, responseSpec, ctx) -> {
        requestSpec.header("AUTH", "TOKEN");
        return ctx.next(requestSpec, responseSpec);
    }).
when().
        post("/api").
then().
  statusCode(200);

5.验证响应状态和正文

REST-assured使用功能丰富的Hamcrest匹配器来验证响应数据。我们可以验证响应中的任何内容,包括状态代码、头文件、cookies、正文甚至是响应时间。

//Verify status
post("/api").then().assertThat().statusCode(200).
post("/api").then().assertThat().statusLine(containsString("OK")). ..

//Verify headers
post("/api").then().assertThat().header("headerName", "headerValue"). ..
post("/api").then().assertThat().headers("headerName1", containsString("value")). .

//Verify body
given()
    .body(requestParams.toString())
    ...
.when()
    .post("/users")
.then()
    ...
    .body("id", notNullValue())
    .body("name", equalTo("lokesh"))
    .body("gender", equalTo("male"))
    .body("status", equalTo("active"))
    .body("email", equalTo("admin@howtodoinjava.com"))
    ...;

//Verify response time

post("/api").then().time(lessThan(2000L));
post("/api").then().time(lessThan(2L), TimeUnit.SECONDS);

6.记录和提取响应数据

日志有助于打印关于请求和响应的有用信息,因此我们可以在测试行为不符合预期时进行调试。Rest-assured支持all()params()body()headers()cookies()method()和*path()*方法,以便在需要时记录具体信息。

  • 使用given().log() 来构建用于记录请求数据的RequestLoggingFilter
  • 使用then().log() 来记录响应数据。
given().log().all() //Log all request specification details
given().log().body() //Log only the request body

post("/api").then().log().all() //Log all response specification details
post("/api").then().log().body() //Log only the request body

如果我们只想在验证失败时记录细节,那么我们可以使用ifValidationFails() 方法。

given().log().ifValidationFails()...
...then().log().ifValidationFails().

REST-assured支持获取整个响应体,甚至响应文件的一部分。为了获得一个特定的响应部分,我们可以使用JSON-Path语法。

InputStream stream = post("/api").asInputStream(); 
byte[] byteArray = post("/api").asByteArray();
String json = post("/api").asString();

String id = given()
        ...
        .post("/users")
    .then()
        ...
        .extract().body().path("user.id");

7.总结

在本教程中,我们学会了使用不同的技术来测试HTTP POST和PUT API,包括发送自定义请求体、头信息、参数和认证令牌。我们还学会了处理响应数据,包括记录、验证、提取和测量性能测试的时间。

学习愉快!!

源代码在Github上

这个帖子有帮助吗?

如果你喜欢这个帖子,请告诉我们。这是我们能够改进的唯一方法。

没有

相关帖子。

  1. 用REST-assured测试REST API
  2. 用REST-assured发送XML请求
  3. 用Jersey/HTTP客户端消耗Dropwizard的REST APIs
  4. Spring REST - HTTP OPTIONS请求处理程序实例
  5. 用HttpClient消耗REST APIs
  6. 使用Spring Boot TestRestTemplate测试POST APIs