学习制作 在自动测试中使用REST-assured的HTTP POST和PUT请求.我们将学习不同的方法来定制请求体、头文件和认证。此外,我们还将学习验证API响应。
目录
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支持来自GSON、JAXB、Jackson、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.File 和InputStream 的参数。我们可以在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,包括发送自定义请求体、头信息、参数和认证令牌。我们还学会了处理响应数据,包括记录、验证、提取和测量性能测试的时间。
学习愉快!!
这个帖子有帮助吗?
如果你喜欢这个帖子,请告诉我们。这是我们能够改进的唯一方法。
有
没有