REST Assured教程

时间:2020-02-23 14:35:33  来源:igfitidea点击:

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