这段代码使用了 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 测试的一种有效方法。