REST Assured教程
REST Assured是Java域特定语言API,用于简化RESTful Web服务的测试。
REST安全的API可用于调用REST Web服务并匹配响应内容以对其进行测试。
REST Assured
REST Assured可用于测试XML以及基于JSON的Web服务。
REST Assured可以与JUnit和TestNG框架集成,以为我们的应用程序编写测试用例。
REST Assured支持POST,GET,PUT,DELETE,OPTIONS,PATCH和HEAD请求,可用于验证和验证这些请求的响应。
REST Assured在Groovy中实现,并使用构建器模式创建请求,设置标头,解析响应,然后将其与期望的数据进行匹配。
它使用Hamcrest Matchers将实际响应与预期响应进行比较。
REST确保的强大功能之一是对XML Path和JSON Path语法的支持,以检查响应数据的特定元素。
这与使用XPath API非常相似。
REST Assured教程前提条件
在创建REST保证测试之前,我们需要一些Web服务进行测试。
以下是本教程中使用的其他组件。
- JSON服务器:这是创建基于JSON的模拟网络服务的好工具,它所需要的只是一个示例JSON文件。
它会自动为我们创建GET,POST,PUT,DELETE API端点。
我已经在JSON Server教程中对此进行了介绍。
JSON下面是基于示例JSON的Web服务的输入。
下图显示了json-server模拟Web服务公开的API。
泽西岛:我正在使用在泽西岛教程中创建的基于XML的Web服务。
您可以从我们的GitHub存储库下载该项目并在tomcat上运行。TestNG:我将使用TestNG通过REST Assured创建测试用例,您也可以使用JUnit。
您可以通过我们的TestNG教程了解TestNG框架。
REST Assured教程
在Eclipse中创建一个基于Maven的项目,并添加Rest Assured和TestNG依赖项。
{
"employees": [
{
"id": 1,
"name": "hyman",
"salary": "10000"
},
{
"name": "David",
"salary": "5000",
"id": 2
}
]
}
REST Assured GET测试
下面的代码片段显示了如何调用GET方法和测试响应JSON元素。
注意使用静态导入,其中一些将在后续示例中使用。
<dependency> <groupId>io.rest-assured</groupId> <artifactId>rest-assured</artifactId> <version>3.1.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.14.3</version> <scope>test</scope> </dependency>
这是另一个复杂的示例,其中我们将TestNG DataProvider与REST Assured一起使用。
import static io.restassured.RestAssured.delete;
import static io.restassured.RestAssured.get;
import static io.restassured.RestAssured.given;
import static org.hamcrest.Matchers.hasItems;
import org.hamcrest.Matchers;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import io.restassured.http.ContentType;
import io.restassured.response.Response;
public class RESTAssuredJSONTests {
final static String ROOT_URI = "https://localhost:7000/employees";
@Test
public void simple_get_test() {
Response response = get(ROOT_URI + "/list");
System.out.println(response.asString());
response.then().body("id", hasItems(1, 2));
response.then().body("name", hasItems("hyman"));
}
}
REST Assured POST示例
下面的代码片段显示了如何使用不同的标头创建JSON请求,然后测试响应元素。
@Test(dataProvider = "dpGetWithParam")
public void get_with_param(int id, String name) {
get(ROOT_URI + "/get/" + id).then().body("name", Matchers.is(name));
}
@DataProvider
public Object[][] dpGetWithParam() {
Object[][] testDatas = new Object[][] {
new Object[] { 1, "hyman" },
new Object[] { 2, "David" } };
return testDatas;
}
REST Assured的PUT示例
@Test
public void post_test() {
Response response = given().
contentType(ContentType.JSON)
.accept(ContentType.JSON)
.body("{\"name\": \"Lisa\",\"salary\": \"2000\"}")
.when()
.post(ROOT_URI + "/create");
System.out.println("POST Response\n" + response.asString());
//tests
response.then().body("id", Matchers.any(Integer.class));
response.then().body("name", Matchers.is("Lisa"));
}
REST Assured的DELETE示例
@Test
public void put_test() {
Response response = given()
.contentType(ContentType.JSON)
.accept(ContentType.JSON)
.body("{\"name\": \"Lisa Tamaki\",\"salary\": \"20000\"}")
.when()
.put(ROOT_URI + "/update/3");
System.out.println("PUT Response\n" + response.asString());
//tests
response.then().body("id", Matchers.is(3));
response.then().body("name", Matchers.is("Lisa Tamaki"));
response.then().body("salary", Matchers.is("20000"));
}
REST Assured XML REST Web服务示例
下图显示了我们的Jersey REST Web服务的输出。
成功案例–响应码200
错误案例-响应码500
这是我们的测试类,显示了如何使用REST Assured测试这两种情况。
@Test
public void delete_test() {
Response response = delete(ROOT_URI + "/delete/3");
System.out.println(response.asString());
System.out.println(response.getStatusCode());
//check if id=3 is deleted
response = get(ROOT_URI + "/list");
System.out.println(response.asString());
response.then().body("id", Matchers.not(3));
}
当执行上述测试类时,我们将获得以下输出。
package com.theitroad.restassured;
import static io.restassured.RestAssured.given;
import org.hamcrest.Matchers;
import org.testng.Assert;
import org.testng.annotations.Test;
import io.restassured.http.ContentType;
import io.restassured.response.Response;
public class RESTAssuredXMLTests {
@Test
public void post_xml_test() {
Response response = given().
contentType(ContentType.XML)
.accept(ContentType.XML)
.body("<empRequest>\n" +
" <id>1</id>\n" +
" <name>PK</name>\n" +
"</empRequest>")
.when()
.post("https://localhost:8080/My-Jersey-Project/rest/emp/getEmp");
System.out.println("POST Response\n" + response.asString());
//tests
Assert.assertEquals(response.getStatusCode(),200);
response.then().body("empResponse.id", Matchers.is("1"));
response.then().body("empResponse.name", Matchers.is("PK"));
}
@Test
public void post_xml_error_test() {
Response response = given().
contentType(ContentType.XML)
.accept(ContentType.XML)
.body("<empRequest>\n" +
" <id>2</id>\n" +
" <name>PK</name>\n" +
"</empRequest>")
.when()
.post("https://localhost:8080/My-Jersey-Project/rest/emp/getEmp");
System.out.println("POST Error Response\n" + response.asString());
//tests
response.then().body("errorResponse.errorId", Matchers.is("2"));
response.then().body("errorResponse.errorCode", Matchers.is("Wrong ID"));
Assert.assertEquals(response.getStatusCode(),500);
}
}
请注意,主要的更改是我们在设置请求正文的位置,检索响应元素(无论是JSON还是XML响应)的方式没有变化。
这使REST安全确保功能强大且易于学习和使用。

