这段代码使用了 Rest-Assured 进行 API 测试,结合 TestNG 框架执行多个 HTTP 请求并进行断言验证。以下是对每个测试方法的详细解释,包括代码逻辑和测试目的。
1. test01() 方法 - 提取响应数据
@Test
public void test01() {String jsonData = "{\"principal\":\"lemon_auto\",\"credentials\":\"lemon123456\",\"appType\":3,\"loginType\":0}";Response response =given().header("Content-Type", "application/json; charset=UTF-8").body(jsonData).when().post("http://mall.lemonban.com:8107/login").then().log().all().extract().response();// 提取响应数据String tokenValue = response.jsonPath().get("userId");System.out.println(tokenValue);
}
代码逻辑:
-
目标:该测试发送一个 POST 请求进行登录,并从响应中提取
userId字段。 -
步骤:
- 使用
given()设置请求头和请求体。 - 使用
when()发送 POST 请求。 - 使用
then()打印响应并提取响应内容(使用jsonPath()方法获取userId字段)。 - 打印提取到的
userId。
- 使用
用途:
测试如何从 JSON 响应中提取字段(如 userId)。适用于需要从响应中提取数据的情况。
2. test_json() 方法 - 提取 JSON 响应中的数据
@Test
public void test_json() {String jsonData = "{\"principal\":\"lemon_auto\",\"credentials\":\"lemon123456\",\"appType\":3,\"loginType\":0}";Response response = given().log().all().queryParam("prodName", "测试").queryParam("sort", 0).queryParam("orderBy", 0).queryParam("current", 1).when().get("http://mall.lemonban.com:8107/search/searchProdPage").then().log().all().extract().response();// 提取响应数据中的产品ID列表List<Object> list = response.jsonPath().getList("records.prodId");System.out.println(list);
}
代码逻辑:
-
目标:该测试发送一个 GET 请求,获取产品信息,并提取产品 ID 列表。
-
步骤:
- 使用
given()设置查询参数。 - 发送 GET 请求并提取 JSON 响应。
- 使用
jsonPath()提取records.prodId列表。 - 打印提取到的产品 ID 列表。
- 使用
用途:
该方法展示了如何提取 JSON 响应中的数组数据。可以用于从响应体中提取多个相同类型的元素(如产品 ID)。
3. test_html() 方法 - 提取 HTML 响应中的数据
@Test
public void test_html() {String jsonData = "{\"principal\":\"lemon_auto\",\"credentials\":\"lemon123456\",\"appType\":3,\"loginType\":0}";Response response =given().log().all().queryParam("prodName", "测试").queryParam("sort", 0).queryParam("orderBy", 0).queryParam("current", 1).when().get("https://www.baidu.com/").then().log().all().extract().response();Object value = response.htmlPath().get("html.head.title");System.out.println(value);
}
代码逻辑:
-
目标:该测试发送一个 GET 请求获取百度首页,并提取 HTML 响应中的
title标签内容。 -
步骤:
- 发送 GET 请求到百度首页。
- 使用
htmlPath()提取 HTML 内容中的title标签。 - 打印提取到的
title内容。
用途:
该方法展示了如何提取 HTML 响应中的元素,常用于测试网页内容(如标题、元数据等)。
4. test_xml() 方法 - 提取 XML 响应中的数据
@Test
public void test_xml() {Response response =given().log().all().header("Content-Type","application/json; charset=UTF-8").when().get("http://httpbin.org/xml").then().log().all().extract().response();Object value = response.xmlPath().get("slideshow.slide[1].item[0]");System.out.println("\n打印结果为:" + value);
}
代码逻辑:
-
目标:该测试发送一个 GET 请求,获取 XML 格式的响应数据,并提取特定元素值。
-
步骤:
- 发送 GET 请求获取 XML 响应。
- 使用
xmlPath()提取slideshow.slide[1].item[0]元素。 - 打印提取到的值。
用途:
展示了如何从 XML 响应中提取数据,适用于解析 XML 格式的响应。
5. test_assert() 方法 - 使用断言验证响应
@Test
public void test_assert() {String jsonData = "{\"principal\":\"lemon_auto\",\"credentials\":\"lemon123456\",\"appType\":3,\"loginType\":0}";Response response =given().header("Content-Type","application/json; charset=UTF-8").body(jsonData).when().post("http://mall.lemonban.com:8107/login").then().log().all().extract().response();int statusCode = response.statusCode();Object actualvalue = response.jsonPath().get("nickName");Assert.assertEquals(statusCode, 200);Assert.assertEquals(actualvalue, "lemon_auto");System.out.println("打印结果为:" + actualvalue);
}
代码逻辑:
-
目标:发送 POST 请求进行登录,断言响应的状态码为 200,并验证
nickName字段的值是否为lemon_auto。 -
步骤:
- 发送 POST 请求进行登录,获取响应。
- 提取响应的状态码和
nickName字段。 - 使用
Assert.assertEquals()断言状态码和nickName是否符合预期。 - 打印
nickName的值。
用途:
该方法展示了如何使用 TestNG 的断言功能进行验证,确保接口返回正确的状态码和数据。适用于验证 API 响应的正确性。
总结
这段代码展示了如何使用 Rest-Assured 提取和验证不同格式的响应数据(JSON、HTML、XML),以及如何使用 TestNG 进行断言验证。每个方法展示了不同的功能和用例,适用于不同类型的 API 测试。
test01():提取 JSON 响应中的userId字段。test_json():提取 JSON 响应中的列表数据。test_html():提取 HTML 响应中的title标签内容。test_xml():提取 XML 响应中的指定元素。test_assert():通过断言验证响应的状态码和字段值。
这些方法可以作为测试 RESTful API 时的数据提取和断言验证模板,帮助我们更高效地进行接口测试。
Rest-Assured API 测试笔记:购物车功能自动化测试
这段代码使用 Rest-Assured 和 TestNG 框架来进行购物车功能的接口自动化测试。下面是每个步骤的详细解释,包括代码逻辑和测试目的。
1. 登录并获取 token
// 1. 登录
String jsonData = "{\"principal\":\"lemon_auto\",\"credentials\":\"lemon123456\",\"appType\":3,\"loginType\":0}";
Response response1 =given().header("Content-Type", "application/json; charset=UTF-8").body(jsonData).when().post("http://mall.lemonban.com:8107/login").then().log().all().extract().response();// 提取返回的 token 和 token_type
String token = response1.jsonPath().get("access_token");
String token_type = response1.jsonPath().get("token_type");
String tokenValue = token_type + token;
System.out.println("打印结果为:" + tokenValue);
代码逻辑:
-
目标:登录并获取
access_token和token_type,然后生成完整的tokenValue用于后续接口请求的认证。 -
步骤:
- 使用
given()设置请求头和请求体(登录的用户名、密码、appType和loginType)。 - 使用
post()发送 POST 请求进行登录。 - 使用
jsonPath()提取返回的access_token和token_type。 - 拼接得到完整的
tokenValue,打印结果,用于后续的认证请求。
- 使用
用途:
- 登录后,获取
token用于后续 API 请求的认证,保证请求的安全性。
2. 搜索商品并获取 prodId
// 2. 选择商品
Response response2 =given().log().all().queryParam("prodName", "测试").queryParam("sort", 0).queryParam("orderBy", 0).queryParam("current", 1).when().get("http://mall.lemonban.com:8107/search/searchProdPage").then().log().all().extract().response();Object prodId = response2.jsonPath().get("records.prodId[0]");
System.out.println("打印结果为:" + prodId);
代码逻辑:
-
目标:搜索商品并从返回的响应中提取
prodId,用于后续商品详情查询或购物车操作。 -
步骤:
- 使用
queryParam()设置查询参数,如商品名称、排序、当前页等。 - 发送 GET 请求并获取商品列表。
- 使用
jsonPath()提取返回的商品列表中的第一个商品的prodId。 - 打印
prodId,用于后续操作。
- 使用
用途:
- 通过商品名称等搜索条件获取商品的
prodId,在后续操作中使用该 ID(如获取商品详情、添加购物车等)。
3. 进入商品详情页并获取 shopId 和 skuId
// 3. 进入商品的详情页面
Response response3 =given().log().all().queryParam("prodId", prodId).when().get("http://shop.lemonban.com:8107/prod/prodInfo?prodId=5826").then().log().all().extract().response();// 获取店铺id
int shopId = response3.jsonPath().get("shopId");// 获取库存id
int skuId = response3.jsonPath().get("skuList.skuId[0]");
代码逻辑:
-
目标:进入商品详情页,获取
shopId和skuId,这两个 ID 是后续添加商品到购物车所需的参数。 -
步骤:
- 使用
queryParam()传递prodId查询商品详情。 - 发送 GET 请求,获取商品的详细信息。
- 使用
jsonPath()提取shopId和skuId。
- 使用
用途:
- 获取商品的
shopId和skuId,这两个参数对于后续添加商品到购物车时是必需的。
4. 添加商品到购物车
// 4. 添加购物车
String jsonData4 = String.format("{\"basketId\":%d,\"count\":1,\"prodId\":\"%s\",\"shopId\":%d,\"skuId\":%d}",basketId, prodId, shopId, skuId
);Response response4 =given().log().all().header("Content-Type", "application/json; charset=UTF-8").header("Authorization", tokenValue).body(jsonData4).when().post("http://shop.lemonban.com:8107/p/shopCart/changeItem").then().log().all().extract().response();// 断言状态码和响应内容
int statusCode = response4.getStatusCode();
Assert.assertEquals(statusCode, 200, "添加购物车失败,状态码不是 200");
System.out.println("响应内容为:" + response4.getBody().asString());
代码逻辑:
-
目标:构建请求体,将商品添加到购物车。
-
步骤:
- 使用
String.format()格式化请求体,填充basketId、prodId、shopId和skuId。 - 使用
given()设置请求头(包括认证 token)和请求体。 - 发送 POST 请求将商品添加到购物车。
- 获取响应并进行断言,确保返回状态码为 200,表示成功添加商品。
- 使用
用途:
- 通过 POST 请求将商品添加到购物车,验证接口返回的状态码是否为 200,确保添加成功。
5. 断言验证
// 断言验证
int statusCode = response4.getStatusCode();
Assert.assertEquals(statusCode, 200, "添加购物车失败,状态码不是 200");
代码逻辑:
-
目标:验证添加商品到购物车的接口响应是否正确,确保返回的状态码为 200。
-
步骤:
- 获取响应的状态码。
- 使用
Assert.assertEquals()验证状态码是否为 200,如果不是,则抛出异常,测试失败。
用途:
- 断言状态码是否为 200,以确保购物车添加操作成功。
总结
这段代码展示了如何使用 Rest-Assured 和 TestNG 进行购物车功能的接口自动化测试,涵盖了以下测试步骤:
- 登录:获取
access_token,用于后续接口请求的认证。 - 商品搜索:获取商品的
prodId。 - 商品详情:获取商品的
shopId和skuId。 - 添加购物车:将商品添加到购物车,并验证接口返回的状态码是否为 200。
- 断言验证:确保购物车功能的操作成功,验证接口响应的准确性。
每个步骤都涵盖了如何发送请求、提取数据和进行验证,是实现 API 测试的一种有效方法。