使用Katalon Studio手動創(chuàng)建REST API請求

介紹

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)站上的RequestObjectRestRequestObjectBuilder。

請注意,如果要使用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

閱讀更多

詳情查閱原文,搬運過程中若詞句有不當(dāng)之處,還望見諒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評論 19 139
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 3,197評論 0 3
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,692評論 18 399
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong閱讀 22,940評論 1 92
  • 申請延期:這兩個月團(tuán)隊成員在做樣板客戶和產(chǎn)品驗證,每天都外出辦公。所以近期和團(tuán)隊成員采用每日郵件匯報的方式來交流信...
    楚天一姝閱讀 380評論 0 0

友情鏈接更多精彩內(nèi)容