這段代碼使用了 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 測試的一種有效方法。