介紹
Katalon為創(chuàng)建REST API請求提供了出色的UI支持,可以參考上一篇(使用Katalon Studio創(chuàng)建你的第一個API測試)。如果你已經(jīng)是Katalon老手,通過Katalon為API測試提供的強(qiáng)大的方法庫,則完全可以自行手動創(chuàng)建。本教程將介紹如何手動創(chuàng)建REST API請求并處理響應(yīng),以使你的代碼更加健壯有效。
要求
熟悉Katalon Studio,并了解Java / Groovy的基礎(chǔ)知識。
RequestObject和ResponseObject
這是處理API請求的兩個主要類。我相信你已經(jīng)發(fā)現(xiàn)了,RequestObject類代表一個API請求,WSBuiltInKeywords.sendRequest方法返回ResponseObject。
現(xiàn)在讓我們創(chuàng)建一個REST API請求作為示例(當(dāng)然,你可以對SOAP API請求執(zhí)行相同的操作)。首先需要獲得請求的信息,包括
- URL
- Request method (GET, POST, PUT, DELETE, …)
- Request headers (Authorization, Content-Type, …)
- Request body (for POST request)
- REST request parameters
接下來,使用以下任一方法從RequestObject創(chuàng)建對象:
直接創(chuàng)建一個RequestObject實例,并使用setRestUrl()和setRestRequestMethod()等方法設(shè)置其信息。
使用RestRequestObjectBuilder,這是Katalon Studio 5.4及更高版本提供的非常有用的類。
import com.kms.katalon.core.testobject.ConditionType
import com.kms.katalon.core.testobject.RequestObject
import com.kms.katalon.core.testobject.ResponseObject
import com.kms.katalon.core.testobject.RestRequestObjectBuilder
import com.kms.katalon.core.testobject.TestObjectProperty
import com.kms.katalon.core.testobject.impl.HttpTextBodyContent
import com.kms.katalon.core.webservice.keyword.WSBuiltInKeywords as WS
public class SampleRequestObject {
String endpoint = "https://www.katalon.com"
String requestMethod = "GET"
String authHeader = "whateverYouNeedForAuthentication"
TestObjectProperty header1 = new TestObjectProperty("Authorization", ConditionType.EQUALS, authHeader)
TestObjectProperty header2 = new TestObjectProperty("Content-Type", ConditionType.EQUALS, "application/json")
TestObjectProperty header3 = new TestObjectProperty("Accept", ConditionType.EQUALS, "application/json")
ArrayList defaultHeaders = Arrays.asList(header1, header2, header3)
/**
* GET requests
* @return
*/
public ResponseObject buildApiRequest1() {
RequestObject ro = new RequestObject("objectId")
ro.setRestUrl(endpoint)
ro.setHttpHeaderProperties(defaultHeaders)
ro.setRestRequestMethod(requestMethod)
ResponseObject respObj = WS.sendRequest(ro)
return respObj
}
public ResponseObject buildApiRequest2() {
RequestObject ro = new RestRequestObjectBuilder()
.withRestUrl(endpoint)
.withHttpHeaders(defaultHeaders)
.withRestRequestMethod(requestMethod)
.build()
ResponseObject respObj = WS.sendRequest(ro)
return respObj
}
}
以上源碼中包括兩種不同的創(chuàng)建請求的方法。它們都返回一個ResponseObject對象。使用RestRequestObjectBuilder創(chuàng)建RequestObject實例時,可以調(diào)用withXXX()和build()方法。
RestRequestObjectBuilder的一個好處是它有額外的方法允許直接為POST請求設(shè)置不同的Content-Type,例如FileBodyContent和MultipartFormBodyContent。也可以使用RequestObject,但使用RestRequestObjectBuilder更直接。
有關(guān)這些類的方法的更多詳細(xì)信息,請訪問Katalon API文檔網(wǎng)站上的RequestObject和RestRequestObjectBuilder。
請注意,如果要使用HTTP headers,可以創(chuàng)建新的TestObjectProperty實例,如代碼段所示。
創(chuàng)建POST請求與GET請求基本相同,但您必須使用RequestObject中的setBodyContent或RestRequestObjectBuilder中的withTextBodyContent 指定請求的body。
import com.kms.katalon.core.testobject.ConditionType
import com.kms.katalon.core.testobject.RequestObject
import com.kms.katalon.core.testobject.ResponseObject
import com.kms.katalon.core.testobject.RestRequestObjectBuilder
import com.kms.katalon.core.testobject.TestObjectProperty
import com.kms.katalon.core.testobject.impl.HttpTextBodyContent
import com.kms.katalon.core.webservice.keyword.WSBuiltInKeywords as WS
public class SampleRequestObject {
String endpoint = "https://www.katalon.com"
String requestMethod = "POST"
String authHeader = "whateverYouNeedForAuthentication"
TestObjectProperty header1 = new TestObjectProperty("Authorization", ConditionType.EQUALS, authHeader)
TestObjectProperty header2 = new TestObjectProperty("Content-Type", ConditionType.EQUALS, "application/json")
TestObjectProperty header3 = new TestObjectProperty("Accept", ConditionType.EQUALS, "application/json")
ArrayList defaultHeaders = Arrays.asList(header1, header2, header3)
String body = '{"dummyRequest":"yes"}'
/**
* POST requests
* @return
*/
public ResponseObject buildPostApiRequest1() {
RequestObject ro = new RequestObject("objectId")
ro.setRestUrl(endpoint)
ro.setHttpHeaderProperties(defaultHeaders)
ro.setRestRequestMethod("POST")
ro.setBodyContent(new HttpTextBodyContent(body))
ResponseObject respObj = WS.sendRequest(ro)
return respObj
}
public ResponseObject buildPostApiRequest2() {
RequestObject ro = new RestRequestObjectBuilder()
.withRestUrl(endpoint)
.withHttpHeaders(defaultHeaders)
.withRestRequestMethod("POST")
.withTextBodyContent(body)
.build()
ResponseObject respObj = WS.sendRequest(ro)
return respObj
}
}
關(guān)于不同的Content-Type,例如file、form等,請參閱RestRequestObjectBuilder API文檔。
SampleResponseObject
接上,我們在發(fā)送API請求時獲得了一個ResponseObject實例。此對象包含響應(yīng)的所有信息,包括status code, response body, response headers, waiting time和許多其他信息。處理響應(yīng)對象的方法如下所示:
import com.kms.katalon.core.testobject.ResponseObject
public class SampleResponseObject {
public static int getStatusCode(ResponseObject resp) {
return resp.getStatusCode()
}
public static String getResponseText(ResponseObject resp) {
return resp.getResponseText()
}
public static long getResponseBodySize(ResponseObject resp) {
return resp.getResponseBodySize()
}
public static long getResponseHeaderSize(ResponseObject resp) {
return resp.getResponseHeaderSize()
}
public static long getWaitingTime(ResponseObject resp) {
return resp.getWaitingTime()
}
}
測試用例中的示例用法:
import com.kms.katalon.core.testobject.ResponseObject
import com.kms.katalon.core.util.KeywordUtil
import mypackage.SampleRequestObject
import mypackage.SampleResponseObject as SampleResponseObject
SampleRequestObject req = new SampleRequestObject()
ResponseObject resp = req.buildApiRequest1()
if(SampleResponseObject.getStatusCode(resp) != 200) {
KeywordUtil.markFailed("Status code is not 200 as expected. It is "
+ SampleResponseObject.getStatusCode(resp))
}
if(SampleResponseObject.getWaitingTime(resp) > 5000) {
KeywordUtil.markFailed("Your request takes more than 5000ms. Actual time is "
+ SampleResponseObject.getWaitingTime(resp))
}
你可能想知道為什么需要SampleResponseObject類,因為我可以通過調(diào)用ResponseObject中的方法直接獲取所有信息。這樣封裝可能對您將來的增強(qiáng)功能有所幫助,因為您的代碼不會那么依賴于ResponseObject類。如果ResponseObject有更改,則只需更新這個封裝類。當(dāng)然,直接使用ResponseObject還是自行封裝,看你的使用習(xí)慣自行選擇。
結(jié)論
本教程重點介紹了Katalon中REST API請求的高級用法。比起手動模式點擊測試,我更喜歡??編寫代碼,因此本教程可能對類似的自動化工程師有所幫助。
RequestObject和ResponseObject是強(qiáng)大的類,可以幫助你詳細(xì)定制API測試。
原文作者
Marek Melocik,目前在捷克共和國布爾諾擔(dān)任測試自動化工程師。自2014年以來,他一直從事QA工作。
可以在這里找到他www.linkedin.com/in/marek-melocik
閱讀更多
- Top 5 Free API Testing Tools (New & Updated Tools)
- Create your first API test with Katalon Studio
- Top 50+ Web API Testing Interview Questions
詳情查閱原文,搬運過程中若詞句有不當(dāng)之處,還望見諒。