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安全确保功能强大且易于学习和使用。