介绍
Katalon为创建REST API请求提供了出色的UI支持,可以参考上一篇(使用Katalon Studio创建你的第一个API测试)。如果你已经是Katalon老手,通过Katalon为API测试提供的强大的方法库,则完全可以自行手动创建。本教程将介绍如何手动创建REST API请求并处理响应,以使你的代码更加健壮有效。
要求
熟悉Katalon Studio,并了解Java / Groovy的基础知识。
RequestObject和ResponseObject
这是处理API请求的两个主要类。我相信你已经发现了,RequestObject类代表一个API请求,WSBuiltInKeywords.sendRequest方法返回ResponseObject。
现在让我们创建一个REST API请求作为示例(当然,你可以对SOAP API请求执行相同的操作)。首先需要获得请求的信息,包括
- URL
- Request method (GET, POST, PUT, DELETE, …)
- Request headers (Authorization, Content-Type, …)
- Request body (for POST request)
- REST request parameters
接下来,使用以下任一方法从RequestObject创建对象:
直接创建一个RequestObject实例,并使用setRestUrl()和setRestRequestMethod()等方法设置其信息。
使用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
}
}
以上源码中包括两种不同的创建请求的方法。它们都返回一个ResponseObject对象。使用RestRequestObjectBuilder创建RequestObject实例时,可以调用withXXX()和build()方法。
RestRequestObjectBuilder的一个好处是它有额外的方法允许直接为POST请求设置不同的Content-Type,例如FileBodyContent和MultipartFormBodyContent。也可以使用RequestObject,但使用RestRequestObjectBuilder更直接。
有关这些类的方法的更多详细信息,请访问Katalon API文档网站上的RequestObject和RestRequestObjectBuilder。
请注意,如果要使用HTTP headers,可以创建新的TestObjectProperty实例,如代码段所示。
创建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
}
}
关于不同的Content-Type,例如file、form等,请参阅RestRequestObjectBuilder API文档。
SampleResponseObject
接上,我们在发送API请求时获得了一个ResponseObject实例。此对象包含响应的所有信息,包括status code, response body, response headers, waiting time和许多其他信息。处理响应对象的方法如下所示:
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类,因为我可以通过调用ResponseObject中的方法直接获取所有信息。这样封装可能对您将来的增强功能有所帮助,因为您的代码不会那么依赖于ResponseObject类。如果ResponseObject有更改,则只需更新这个封装类。当然,直接使用ResponseObject还是自行封装,看你的使用习惯自行选择。
结论
本教程重点介绍了Katalon中REST API请求的高级用法。比起手动模式点击测试,我更喜欢编写代码,因此本教程可能对类似的自动化工程师有所帮助。
RequestObject和ResponseObject是强大的类,可以帮助你详细定制API测试。
原文作者
Marek Melocik,目前在捷克共和国布尔诺担任测试自动化工程师。自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
详情查阅原文,搬运过程中若词句有不当之处,还望见谅。