原文作者:李文

性能工具之nGrinder关联脚本编写简单介绍_上传

背景:

     在做性能测试,脚本之间的关联是一个比较棘手的问题,nGrinder脚本是怎么关联,其实也是比较简单的,简单前提条件是自己具备一定的知识,也就是需要代码基础、http协议知识、网络知识等这些基础知识,这样才能开展工作。

     

常见的获取请求结果方法有:

  1. 通过正则表达方式获取结果;
  2. 通过xpath方式获取相关结果;
  3. 通过JSON解析获取相关结果

关联介绍

  • 关联的目的是后面请求需要,如果不需要就不需要关联。
  • 关联获取结果做断言

想了解更多、更详细关联知识请查找相关资料。

      在编写nGrinder脚本之前请学习下groovy语法这样方便写脚本,脚本编写建议在idea中上写脚本与调试脚本,这样有语法提示能很快写出脚本与调试脚本,写完脚本后直接复制到线上脚本中在微调验证就能使用。

脚本编写简单演示

     本次脚本编写与调试需要解析JSON所以需要上传fastjson-1.2.62.jar用例解析JSON脚本,下载地址为:

https://mvnrepository.com/artifact/com.alibaba/fastjson

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.62</version>
</dependency>

1、如果是线上直接写脚本需要上传jar:

       在脚本页面的脚本文件夹中新建lib文件夹,之后再lib文件中上传相关的jar包,如下图:

性能工具之nGrinder关联脚本编写简单介绍_json_02

点击文件夹:

性能工具之nGrinder关联脚本编写简单介绍_Test_03

注意:一定在脚本文件相关的地方新建lib文件夹,并且在lib下中上传jar如:

性能工具之nGrinder关联脚本编写简单介绍_Test_04

2、如果是idea中写代码与调试脚本,需要在脚本文件中新建lib文件夹之后在把jar包加入工程中去如:

性能工具之nGrinder关联脚本编写简单介绍_Test_05

相关工程:https://github.com/357712148/nGrinder/blob/master/script-sample/test-with-login/OneAndTwo.groovy

性能工具之nGrinder关联脚本编写简单介绍_Test_06

工程下载地址:

https://github.com/357712148/nGrinder.git


该工程下载后需要处理下才可以使用:

点击

性能工具之nGrinder关联脚本编写简单介绍_上传_07

再次点击:

性能工具之nGrinder关联脚本编写简单介绍_json_08

选择脚本工程

性能工具之nGrinder关联脚本编写简单介绍_上传_09

再次选择:

性能工具之nGrinder关联脚本编写简单介绍_Test_10

上面操作后即可实现代码与调试脚本,如果还是有问题,自己微调即可。

idea中调试并且测试

性能工具之nGrinder关联脚本编写简单介绍_json_11



线上调试:

性能工具之nGrinder关联脚本编写简单介绍_Test_12

代码示例

1. import HTTPClient.Cookie
2. import HTTPClient.CookieModule
3. import HTTPClient.HTTPResponse
4. import HTTPClient.NVPair
5. import com.alibaba.fastjson.JSONArray
6. import groovy.json.JsonParser
7. import groovy.json.JsonSlurper
8. import net.grinder.plugin.http.HTTPPluginControl
9. import net.grinder.plugin.http.HTTPRequest
10. import net.grinder.script.GTest
11. import net.grinder.scriptengine.groovy.junit.GrinderRunner
12. import net.grinder.scriptengine.groovy.junit.annotation.BeforeProcess
13. import net.grinder.scriptengine.groovy.junit.annotation.BeforeThread
14. import org.junit.Before
15. import org.junit.Test
16. import org.junit.runner.RunWith
17. import com.alibaba.fastjson.JSONObject
18. import static net.grinder.script.Grinder.grinder
19. import static org.hamcrest.Matchers.is
20. 
21. 
22. // import static net.grinder.util.GrinderUtils.* // You can use this if you're using nGrinder after 3.2.3
23. 
24. import static org.junit.Assert.assertThat
25. 
26. /**
27.  * @Title: OneAndTwo* @Description: this is
28.  * @author liwen* @date 2019/10/27 / 11:00
29.  */
30. @RunWith(GrinderRunner)
31. class OneAndTwo {
32. 
33.     public static GTest test
34.     // 定义 HTTPRequest 静态变量 request,用于发送 HTTP 请求
35.     public static HTTPRequest request
36.     // 定义 NVPair 数组 headers ,用于存放通用的请求头数据
37.     public static NVPair[] headers = []
38.     // 定义 NVPair 数组 params ,用于存放请求参数数据
39.     public static NVPair[] params = []
40.     // 定义 Cookie 数组 cookies ,用于存放通用的 cookie 数据
41.     public static Cookie[] cookies = []
42. 
43.     //存储第一个请求得参数
44.     def paramName = new ArrayList()
45. 
46. 
47.     @BeforeProcess
48.     public static void beforeProcess() {
49.         // 设置请求响应超时时间(ms)
50.         HTTPPluginControl.getConnectionDefaults().timeout = 6000
51.         // 创建GTest对象,第一个参数1代表有多个请求/事务时的执行顺序ID,
52.         // 第二个参数是请求/事务的名称,会显示在summary结果中,有多个请求/事务时,要创建多个GTest对象
53.         test = new GTest(1, "User_find_01")
54.         //创建 HTTPRequest 对象,用于发起 HTTP 请求
55.         request = new HTTPRequest()
56.         // Set header datas
57.         List<NVPair> headerList = new ArrayList<NVPair>()
58.         headerList.add(new NVPair("Content-Type", "application/x-www-form-urlencoded"))
59.         headerList.add(new NVPair("Connection", "keep-alive"))
60.         headers = headerList.toArray()
61.         // Set param datas
62. 
63. //        List<Cookie> cookieList = new ArrayList<Cookie>()
64. //        cookieList.add(new Cookie("Cookie", "null", "localhost:8888", "", new Date(), true))
65. //        cookies = cookieList.toArray()
66.         grinder.logger.info("before process.");
67. 
68.     }
69. 
70.     @BeforeThread
71.     public void beforeThread() {
72. //        注册事件,启动test,第二个参数要与@Test注解的方法名保持一致,有多个请求/事务时,要注册多个事件
73.         test.record(this, "test")
74. 
75.         //配置延迟报告统计结果
76.         grinder.statistics.delayReports = true;
77.         grinder.logger.info("before thread.");
78.     }
79. 
80.     @Before
81.     public void before() {
82.         //在这里可以添加headers属性和cookies
83. //        request.setHeaders(headers)
84.         cookies.each { CookieModule.addCookie(it, HTTPPluginControl.getThreadHTTPClientContext()) }
85.         grinder.logger.info("before thread. init headers and cookies");
86. 
87.     }
88. 
89.     @Test
90.     public void test() {
91.         getUserFind()
92.         getItem()
93.     }
94. 
95. 
96.     public void getUserFind() {
97.         // 发送GET请求
98.         HTTPResponse resu = request.GET("http://localhost:8888/userfind")
99.         def text1 = resu.getText()
100.         JSONObject jsonObject = JSONObject.parseObject(text1);
101.         JSONObject object = jsonObject.getJSONObject("extend")
102.         JSONArray array = object.getJSONArray("info")
103.         for (int i = 0; i < array.size(); i++) {
104.             JSONObject object1 = JSONObject.parseObject(array.get(i).toString())
105.             Object name = object1.get("userName");
106.             paramName.add(String.valueOf(name))
107.         }
108. 
109.         assertThat(resu.statusCode, is(200))
110.     }
111. 
112.     public void getItem() {
113.         List<NVPair> paramList = new ArrayList<NVPair>()
114.         //获取参数的第一个值
115.         paramList.add(new NVPair("userName", paramName.get(0)))
116.         params = paramList.toArray()
117.         // Set cookie datas
118.         HTTPResponse result = request.GET("http://localhost:8888/findName", params)
119.         def text = result.getText()
120. 
121.         grinder.logger.info("这是第二请求" + text)
122.         // 断言HTTP请求状态码
123.         assertThat(result.statusCode, is(200))
124.     }
125. }

结果显示:

性能工具之nGrinder关联脚本编写简单介绍_上传_13

性能工具之nGrinder关联脚本编写简单介绍_json_14

这是相应的测试工程代码下载地址:

https://github.com/357712148/bodygit.git

代码截图:

性能工具之nGrinder关联脚本编写简单介绍_json_15


送大家一句话:

    只有比别人更早,更勤奋的努力,才能尝到,成功的滋味,今生没有努力,却成功的人,说明他前世比别人,更早  更勤奋,因果是一丝不爽,而不是守株待兔。


性能工具之nGrinder关联脚本编写简单介绍_Test_16