2024-12-02 01:45:00
做性能测试脚本是一个实际下功夫的地方,工作中常见也就是key-value,json方式比较多,那么nGrinder脚本咱们怎么编写以下简单介绍。
二、实现一个get请求demo首先,通过SpringBoot编写一个工程实现增删改查,通过Get请求获取:
http://localhost:8888/findinfo?username=600128该工程controller层中用最简单Get请求查询数据,该代码为:
@GetMapping("/findinfo")@ResponseBodypublicList<UserTable>findUser(UserTableuserInfo){List<UserTable>UserInfo=userService.findinfo(userInfo);returnUserInfo;}@ResponseBody注解会自动转换Json显示到页面。该工程很简单,就不展示其他代码,大家在做练习的时候,可以找自己公司的项目或者自己写一个demo工程,进行练习。
接口层:
publicinterfaceUserService{List<UserTable>findinfo(UserTableuserInfo);}实现层:
@ServicepublicclassUserServiceImplimplementsUserService{@OverridepublicList<UserTable>findinfo(UserTableuserInfo){UserTableExampleexample=newUserTableExample();UserTableExample.Criteriacriteria=example.createCriteria();criteria.andUsernameEqualTo(userInfo.getUsername());returnuserTableMapper.selectByExample(example);}}数据库Dao层:
该层通过Generator插件生成
Generator插件参考代码:
<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEgeneratorConfigurationPUBLIC"-//mybatis.org//DTDMyBatisGeneratorConfiguration1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration><!--数据库驱动:选择你的本地硬盘上面的数据库驱动包--><classPathEntrylocation="..\mysql-manager\lib\mysql-connector-java-5.1.6.jar"/><contextid="DB2Tables"targetRuntime="MyBatis3"><commentGenerator><propertyname="suppressDate"value="true"/><!--是否去除自动生成的注释true:是:false:否--><propertyname="suppressAllComments"value="true"/></commentGenerator><!--数据库链接URL,用户名、密码--><jdbcConnectiondriverClass="com.mysql.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/7d"userId="root"password="123456"></jdbcConnection><javaTypeResolver><propertyname="forceBigDecimals"value="false"/></javaTypeResolver><!--生成模型的包名和位置--><javaModelGeneratortargetPackage="com.sevendgrop.pojo"targetProject="src/main/java"><propertyname="enableSubPackages"value="true"/><propertyname="trimStrings"value="true"/></javaModelGenerator><!--生成映射文件的包名和位置--><sqlMapGeneratortargetPackage="mapping"targetProject="src/main/resources"><propertyname="enableSubPackages"value="true"/></sqlMapGenerator><!--生成DAO的包名和位置--><javaClientGeneratortype="XMLMAPPER"targetPackage="com.sevendgrop.mapper"targetProject="src/main/java"><propertyname="enableSubPackages"value="true"/></javaClientGenerator><!--要生成的表tableName是数据库中的表名或视图名domainObjectName是实体类名--><tableschema=""tableName="case_table"></table></context></generatorConfiguration>Pom.xml配置:
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><fork>true</fork></configuration></plugin><!--mybatisgenerator自动生成代码插件--><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.2</version><configuration><configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile><overwrite>true</overwrite><verbose>true</verbose></configuration></plugin></plugins></build>maven插件编写参考:
配置上面后点击:
运行即可就能生成数据库连接SQL语句。
三、脚本编写打开上一节使用源码部署的工程,在介绍源码运行脚本地方新建一个脚本,参考如下代码修改成自己练习的脚本。
在nGrinder中新建的脚本编写如下代码:
importorg.junit.FixMethodOrderimportstaticnet.grinder.script.Grinder.grinderimportstaticorg.junit.Assert.*importstaticorg.hamcrest.Matchers.*importnet.grinder.plugin.http.HTTPRequestimportnet.grinder.plugin.http.HTTPPluginControlimportnet.grinder.script.GTestimportnet.grinder.script.Grinderimportnet.grinder.scriptengine.groovy.junit.GrinderRunnerimportnet.grinder.scriptengine.groovy.junit.annotation.BeforeProcessimportnet.grinder.scriptengine.groovy.junit.annotation.BeforeThreadimportorg.junit.Beforeimportorg.junit.BeforeClassimportorg.junit.Testimportorg.junit.runner.RunWithimportjava.util.Dateimportjava.util.Listimportjava.util.ArrayListimportHTTPClient.CookieimportHTTPClient.CookieModuleimportHTTPClient.HTTPResponseimportHTTPClient.NVPair@RunWith(GrinderRunner)classPostGetDemo{publicstaticGTesttest//定义HTTPRequest静态变量request,用于发送HTTP请求publicstaticHTTPRequestrequest//定义NVPair数组headers,用于存放通用的请求头数据publicstaticNVPair[]headers=[]//定义NVPair数组params,用于存放请求参数数据publicstaticNVPair[]params=[]//定义Cookie数组cookies,用于存放通用的cookie数据publicstaticCookie[]cookies=[]@BeforeProcesspublicstaticvoidbeforeProcess(){//设置请求响应超时时间(ms)HTTPPluginControl.getConnectionDefaults().timeout=6000//创建GTest对象,第一个参数1代表有多个请求/事务时的执行顺序ID,第二个参数是请求/事务的名称,会显示在summary结果中,有多个请求/事务时,要创建多个GTest对象test=newGTest(1,"localhost:8888")//创建HTTPRequest对象,用于发起HTTP请求request=newHTTPRequest()//SetheaderdatasList<NVPair>headerList=newArrayList<NVPair>()headerList.add(newNVPair("Content-Type","application/x-www-form-urlencoded"))headerList.add(newNVPair("Connection","keep-alive"))headers=headerList.toArray()//SetparamdatasList<NVPair>paramList=newArrayList<NVPair>()paramList.add(newNVPair("username","600128"))params=paramList.toArray()//SetcookiedatasList<Cookie>cookieList=newArrayList<Cookie>()cookieList.add(newCookie("Cookie","Idea-96adee05=87213429-7753-4183-99d0-c1c3362ce5d0;Hm_lvt_eb54a8c74fe4cb91ad8ca004e48cd3f9=1545999605;Pycharm-5b892e29=6772acb9-e87b-4d37-98e3-bff82e412d17;csrftoken=KDr8oYtD0gKh7UbS5fWSROzEOX6rjX3CN26pz9PQu9AczLMGFhw53ZrjAhoIOTE7;Hm_lvt_f2c884fc06fca522c4105429259b8a73=1558506687;Webstorm-173930bd=052a6829-b802-4eb0-a1e2-e348f1012604;_ga=GA1.1.1061327805.1562753587;UM_distinctid=16c02a6b049e1-02b6b032525db4-e343166-144000-16c02a6b04a120;CNZZDATA4617777=cnzz_eid%3D1637582848-1563412391-%26ntime%3D1563412391;Hm_lvt_0cb375a2e834821b74efffa6c71ee607=1563412574;bad_id22bdcd10-6250-11e8-917f-9fb8db4dc43c=a32ab941-a8f9-11e9-9989-93f7b4f25032;Idea-2b3f02ca=87213429-7753-4183-99d0-c1c3362ce5d0;cookie_lang=0;JSESSIONID=801DE60D9A00C391F80ABE0CD94A6E25","localhost:8888","",newDate(),true))cookies=cookieList.toArray()grinder.logger.info("beforeprocess.");}@BeforeThreadpublicvoidbeforeThread(){//注册事件,启动test,第二个参数要与@Test注解的方法名保持一致,有多个请求/事务时,要注册多个事件test.record(this,"test")//配置延迟报告统计结果grinder.statistics.delayReports=true;grinder.logger.info("beforethread.");}@Beforepublicvoidbefore(){//在这里可以添加headers属性和cookies//request.setHeaders(headers)cookies.each{CookieModule.addCookie(it,HTTPPluginControl.getThreadHTTPClientContext())}grinder.logger.info("beforethread.initheadersandcookies");}@Testpublicvoidtest(){//发送GET请求HTTPResponseresult=request.GET("http://localhost:8888/findinfo",params)deftext=result.getText()grinder.logger.info(text)//断言HTTP请求状态码assertThat(result.statusCode,is(200))}}再次运行:
点击运行配置加上:
-javaagent:D:\maven\repository\net\sf\grinder\grinder-dcr-agent\3.9.1\grinder-dcr-agent-3.9.1.jar配置说明如下:
之后点击运行即可:
结果如下:
关键点需要注意这里:
List<NVPair>headerList=newArrayList<NVPair>()headerList.add(newNVPair("Content-Type","application/x-www-form-urlencoded"))headerList.add(newNVPair("Connection","keep-alive"))headers=headerList.toArray()注意头信息:
publicstaticNVPair[]headers=[]publicstaticNVPair[]params=[]publicstaticCookie[]cookies=[]查看源码就知道怎么传值,这里列举cookie源码传值说明:
通过源码查看得知如果传cookie需要newcookie实体通过构造方法进行传值入:
@GetMapping("/findinfo")@ResponseBodypublicList<UserTable>findUser(UserTableuserInfo){List<UserTable>UserInfo=userService.findinfo(userInfo);returnUserInfo;}0查看@BeforeThread注解下会执行test.record方法源码如下:
@GetMapping("/findinfo")@ResponseBodypublicList<UserTable>findUser(UserTableuserInfo){List<UserTable>UserInfo=userService.findinfo(userInfo);returnUserInfo;}1解释:
target:指脚本对象,这里是this;
methodNam:是需要统计的方法名,通常都是被@Test注释的方法。如果未配置,方法会正常执行,但是没有统计结果数据;
以下代码是可以复制出来修改的代码
importorg.junit.FixMethodOrderimportstaticnet.grinder.script.Grinder.grinderimportstaticorg.junit.Assert.*importstaticorg.hamcrest.Matchers.*importnet.grinder.plugin.http.HTTPRequestimportnet.grinder.plugin.http.HTTPPluginControlimportnet.grinder.script.GTestimportnet.grinder.script.Grinderimportnet.grinder.scriptengine.groovy.junit.GrinderRunnerimportnet.grinder.scriptengine.groovy.junit.annotation.BeforeProcessimportnet.grinder.scriptengine.groovy.junit.annotation.BeforeThreadimportorg.junit.Beforeimportorg.junit.BeforeClassimportorg.junit.Testimportorg.junit.runner.RunWithimportjava.util.Dateimportjava.util.Listimportjava.util.ArrayListimportHTTPClient.CookieimportHTTPClient.CookieModuleimportHTTPClient.HTTPResponseimportHTTPClient.NVPair@RunWith(GrinderRunner)classPostGetDemo{publicstaticGTesttest//定义HTTPRequest静态变量request,用于发送HTTP请求publicstaticHTTPRequestrequest//定义NVPair数组headers,用于存放通用的请求头数据publicstaticNVPair[]headers=[]//定义NVPair数组params,用于存放请求参数数据publicstaticNVPair[]params=[]//定义Cookie数组cookies,用于存放通用的cookie数据publicstaticCookie[]cookies=[]@BeforeProcesspublicstaticvoidbeforeProcess(){//设置请求响应超时时间(ms)HTTPPlugi