nGrinder中快速編寫groovy指令碼04-傳送POST請求

testingbang發表於2019-08-27

POST請求分類:
1、根據是否修改程式碼,分為兩種方式:
一種是在UI介面新增後自動生成指令碼,一種是直接在指令碼中新增
2、根據請求引數的不同,主要可以分為兩種:
param為key value格式
body為json格式
一、透過UI方式傳送POST請求–key/value引數
透過 UI 設定:指令碼 -> 新建指令碼 -> 顯示高階配置
當選擇了請求方法為POST後,在高階配置中預設會在headers中顯示Content-Type為x-www-form-urlencoded,同時,新增key/value格式的params:

生成程式碼如下(由於篇幅限制,去掉import部分):
@RunWith(GrinderRunner)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
class TestRunner {

public static GTest test
public static HTTPRequest request
public static NVPair[] headers = []
public static NVPair[] params = []
public static Cookie[] cookies = []

@BeforeProcess
public static void beforeProcess() {
HTTPPluginControl.getConnectionDefaults().timeout = 6000
test = new GTest(1, ")
request = new HTTPRequest()
// Set header datas
List<NVPair> headerList = new ArrayList<NVPair>()
headerList.add(new NVPair("Content-Type", "application/x-www-form-urlencoded"))
headerList.add(new NVPair("Connection", "keep-alive"))
headers = headerList.toArray()
// Set param datas
List<NVPair> paramList = new ArrayList<NVPair>()
paramList.add(new NVPair("name", "jing"))
paramList.add(new NVPair("age", "18"))
paramList.add(new NVPair("desc", "beauty"))
params = paramList.toArray()
// Set cookie datas
List<Cookie> cookieList = new ArrayList<Cookie>()
cookieList.add(new Cookie("token", "xxxxxxxx", ", "", new Date(32503647599000L), false))
cookies = cookieList.toArray()
grinder.logger.info("before process.");
}

@BeforeThread
public void beforeThread() {
test.record(this, "test")
grinder.statistics.delayReports=true;
grinder.logger.info("before thread.");
}

@Before
public void before() {
request.setHeaders(headers)
cookies.each { CookieModule.addCookie(it, HTTPPluginControl.getThreadHTTPClientContext()) }
grinder.logger.info("before thread. init headers and cookies");
}

@Test
public void test(){
HTTPResponse result = request.POST("https://, params)

assertThat(result.statusCode, is(200))
assertThat(result.getText(), containsString("jing"))
}
}

從以上程式碼可以看出,這種方式跟之前使用GET方式新增引數的效果一樣,都是把引數新增在@BeforeProcess,不同的只是在@Test中使用的是request.POST方法。

二、透過UI方式傳送POST請求–json
透過 UI 設定:指令碼 -> 新建指令碼 -> 顯示高階配置
當選擇了請求方法為POST後,在高階配置中的headers中選擇Content-Type為application/json,同時,新增json字串:

生成程式碼如下(由於篇幅限制,去掉import部分):
@RunWith(GrinderRunner)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
class TestRunner {

public static GTest test
public static HTTPRequest request
public static NVPair[] headers = []
public static String body = "{"name":"jing","comment":"hello"}"
public static Cookie[] cookies = []

@BeforeProcess
public static void beforeProcess() {
HTTPPluginControl.getConnectionDefaults().timeout = 6000
test = new GTest(1, ")
request = new HTTPRequest()
// Set header datas
List<NVPair> headerList = new ArrayList<NVPair>()
headerList.add(new NVPair("Content-Type", "application/json"))
headers = headerList.toArray()
grinder.logger.info("before process.");
}

@BeforeThread
public void beforeThread() {
test.record(this, "test")
grinder.statistics.delayReports=true;
grinder.logger.info("before thread.");
}

@Before
public void before() {
request.setHeaders(headers)
cookies.each { CookieModule.addCookie(it, HTTPPluginControl.getThreadHTTPClientContext()) }
grinder.logger.info("before thread. init headers and cookies");
}

@Test
public void test(){
HTTPResponse result = request.POST("https://, body.getBytes())

assertThat(result.statusCode, is(200))
}
}

從以上程式碼可以看出,這種方式是在靜態變數中定義了body的內容,在@BeforeProcess中新增json請求頭,並在@Test中的request.POST方法中加入了body引數。
關鍵程式碼如下:

public static String body = "{"name":"jing","comment":"hello"}"

headerList.add(new NVPair("Content-Type", "application/json"))

HTTPResponse result = request.POST("https://, body.getBytes())

三、直接在指令碼中為POST請求新增json格式的body
使用UI方式新增的json字串預設是在建立靜態變數body的同時新增的;
直接修改指令碼的話,就比較靈活,可以在類的任意位置新增,然後在POST請求中呼叫
(但是要注意變數作用域的問題)
// 定義json字串
String jsonStr = '{"name": "jing"}';

//在@Test的POST方法中使用json字串,同時新增header
request.POST("https://, jsonStr.getBytes(), [
    new NVPair("Content-Type", "application/json"
] as NVPair[])

其中,需要注意的是:

POST(java.lang.String uri, byte[] data)
此方法中接收body引數時需要把字串轉成位元組陣列。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69942496/viewspace-2655106/,如需轉載,請註明出處,否則將追究法律責任。

相關文章