发布新日志

  • jmeter测试接口--解决参数化取唯一值的问题(用UUID)

    2018-02-23 16:18:45

    一、用时间函数:

    jmeter参数化,而且要取唯一值,可以考虑用时间函数加上其他函数一起:

    1
    {"merchant_id":"615051940310129","biz_code":"1001","order_id":"${__time(,)}${__counter(,)}","order_amt":"100","bg_url":"www.baidu.com","sign":"22A356FF1010B22670417E2107DB4229"}

     但是如果接口的处理能力很快,这个参数还是会存在重复的id;

     

    二、用UUID:

    解决上面的问题,还可以用UUID来作为参数,UUID通常以36字节的字符串表示,示例如下:

    1
    3F2504E0-4F89-11D3-9A0C-0305E82C3301

     

     订单ID多数是数字的,如果不需要“-”,可以去掉。

    如下是分析在jmeter中如何使用:

    1.新建一个事务;

    2.新建一个BeanShell Sampler;

    3.新建一个http请求;

    如下图:

     

    4.在BeanShell Sampler编写UUID的代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import java.util.UUID;
     
    UUID uuid1 = UUID.randomUUID();    //获取UID的值
     
    vars.put("order_id",(uuid1.toString()).toUpperCase().replaceAll("-",""));  
     
     //去掉UUID的“-”,再赋值给order_id  运行获取的参数就是:3F2504E04F8911D39A0C0305E82C3301
     
    //vars.put("order_id",(uuid1.toString()).toUpperCase()); 
    查看(3571) 评论(0) 收藏 分享 管理

  • JMeter-Java Sampler遇到的问题

    2018-02-22 16:59:12

    当运行main方法进行调试时报错,报错如下:
    Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/jorphan/logging/LoggingManager
        at org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient.<clinit>(AbstractJavaSamplerClient.java:55)
    Caused by: java.lang.ClassNotFoundException: org.apache.jorphan.logging.LoggingManager
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 1 more

    问题在于少加载了依赖包,可以把jmeterhome/ lib下所有jar加载到eclipse环境变量中试试。
  • 90% Line

    2017-03-15 20:32:30

    90% Line -- 如果把响应时间从小到大顺序排序,那么90%的请求的响应时间在这个范围之内

    假如:

    有10个数:

    1、2、3、4、5、6、7、8、9、10    按由大到小将其排列。

    求它的第90%百分位,也就是第9个数刚好是9 ,那么他的90%Line 就是9 。

    另一组数:

    2、2.1、2.5、3、3.4、3.4、4、4、4、4、5、5、5、5.9、5.91、6.8、8、12、24、24.1   按由大到小将其排列。

    求它的第90%百分位,第18个数是12 么,他的90%Line 就是12。 

     

    再来解释90%Line 

    一组数由小到大进行排列,找到他的第90%个数(假如是12),那么这个数组中有90%的数将小于等于12 。

    用在性能测试的响应时间也将非常有意义,也就是90%用户响应时间不会超过12 秒。


  • 虚拟机下64位win7+jdk1.8+jmeter3.0启动报错解决方法

    2016-11-03 15:04:52

    1、虚拟机下64位win7+jdk1.8+jmeter3.0启动时,

    发现GUI界面总是有warning提示:

    WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.

    在网上搜了搜,发现是Jmeter需要写注册表。

    解决方法:The work around is to login as the administrator and create the key HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs.

    以管理员身份登录,regedit,创建HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs项

    2、启动时报错:OpenGL Warning: No pincher,please call crStateSetCurrentPointers() in your SPU

    解决方法:前面的勾去掉。如下图。


  • 使用maven开发的项目,如何更方便地提取第三方包

    2012-11-15 15:41:01

    如果你的项目使用maven构建的话,当项目要上线,部署到服务器上去的时候或许会碰见这样的问题。问题就是,服务器上没有maven的环境,也就是说,项目所依赖到的那些仓库(repository)中的jar包你需要单独提取出来上传到服务器中去。

         我知道pom类型如果是war的话,在使用mvn package 的命令就能自动将项目依赖的jar包打到web-inf 下的lib文件夹中。但是,如果pom类型为jar的话,当你调用mvn package命令,执行过程中不会将依赖的第三方包提取出来。

         以前,我的做法是,等到项目要上线的时候将pom类型改成war,然后执行一下mvn package命令,这样先把所以依赖到的包提取出来,然后再把pom类型改成jar,这样虽然能完成任务,但是,总感觉这样的做法比较拙劣。

         所以最近寻找了一下有没有更好的办法,其实很简单,就是使用 maven的 assembly插件,在pom.xml 添加如下插件:

    1. <project>  
    2.   [...]  
    3.   <build>  
    4.     [...]  
    5.     <plugins>  
    6.       <plugin>  
    7.         <!-- NOTE: We don't need a groupId specification because the group is  
    8.              org.apache.maven.plugins ...which is assumed by default.  
    9.          -->  
    10.         <artifactId>maven-assembly-plugin</artifactId>  
    11.         <version>2.2-beta-5</version>  
    12.         <configuration>  
    13.           <descriptorRefs>  
    14.             <descriptorRef>jar-with-dependencies</descriptorRef>  
    15.           </descriptorRefs>  
    16.         </configuration>  
    17.         [...]  
    18. </project>  
    19. 双击运行如图所示assembly:assembly即可。

  • JMeterPlugin 部分说明

    2012-08-01 16:45:40

    因为用Jmeter做压力测试的缘故,需要用Jmeter生成性能图表,可以Jmeter本提供的图是在是看不懂,在google的code上找到了JMeterPlugin,他可以把JMeter生成的jtl文件做出很好的统计图,同时还支持机器的cpu、memory、swap、disk io和network的监控,实在是个不错的插件。

    JMeterPluging生成的很多图都很Thread有关系,因此在使用non gui模式时一定要在jmeter.properties中修改下来参数

    jmeter.save.saveservice.thread_counts=true

    在linux下使用non gui模式的命令是:

    ./jmeter.sh -n -t testplan.jmx -l result.jtl

    testplan.jmx就是测试计划文件,result.jtl就是结果文件,如果没有把thread_count这个参数打开是不会记录到线程有关的信息的:

    <httpSample t="363" lt="363" ts="1301644667897" s="true" lb="http://localhost/" rc="200" rm="OK" tn="Thread Group 1-138" dt="text" by="7888" ng="200" na="200"/>

    ng代表当前线程组中有多少活动线程

    na代表整个测试中有多少活动线程

    如果没有打开thread_count参数就不会有ng和na的值了。

    顺带在说明一下别的参数的意思:

    • t表示从请求开始到响应结束的时间
    • lt表示整个的空闲时间
    • ts表示访问的时刻
    • s表示返回的结果true表示成功,false表示失败
    • lb表示标题
    • rc表示返回的响应码
    • rm表示响应信息
    • tn表示线程的名字“1-138”表示第1个线程组的第138个线程。
    • dt表示响应的文件类型
    • by表示请求和响应的字节数

     

    由于JMeterPlugin生成的图很多,下面就每类图做一个简要的介绍:

    1  Bytes Throughput Over Time  每秒传输字节吞吐量,表明Jmeter在测试时,随着时间推移发送和接受的字节数

     

    JMeterPlugin 部分说明 - zhang_jing - zhang_jing的博客

     

     

    2  Response Codes per Second  每秒返回的响应码,表明Jmeter测试期间,随着时间的推移返回的响应码,从中我们可看到测试期间在哪个时间段内出现了错误。就可以分析在该时间内系统的什么环境因素,导致的错误。

    JMeterPlugin 部分说明 - zhang_jing - zhang_jing的博客

     

     

    3  Response Latencies Over Time 每秒钟的响应等待时间, 表明Jmeter测试期间,随着时间的推移系统的响应等待时间的变化,也是系统随着时间推移,系统效率的变化。

    JMeterPlugin 部分说明 - zhang_jing - zhang_jing的博客

     

    4  Response Times Distribution  响应时间分布, X轴表示的是响应时间,Y轴表示的是响应次数,F(X,Y)表示系统在某种响应时间内的响应次数是多少,如果在响应时间短的地方,响应次数多,说明系统的效率比较高。

    JMeterPlugin 部分说明 - zhang_jing - zhang_jing的博客

     

    5  Response Times Over Time 每秒钟响应时间,X轴表示的是系统运行的时刻,Y轴表示的是响应时间,F(X,Y)表示系统随着时间的推移,系统的响应时间的变化,可以看出响应时间稳定性。

    JMeterPlugin 部分说明 - zhang_jing - zhang_jing的博客

     
    6  Response Times Percentiles 响应时间百分比,X轴表示的是百分比,Y轴表示的是响应时间,F(X,Y)表示低于某个百分比的响应时间,比如有80%的响应低于400ms。

    JMeterPlugin 部分说明 - zhang_jing - zhang_jing的博客

     

    7  Response Times vs Threads 响应时间用户数, X轴表示的是活动线程数,也就是并发访问的用户数,Y轴表示的是响应时间,F(X,Y)表示在某种并发量的情况下,系统的响应时间是多少。

     

    JMeterPlugin 部分说明 - zhang_jing - zhang_jing的博客

     

    8  Transaction Throughput Over Time   每秒处理的事务吞吐量  统计随着时间推移每秒可能的事务吞吐量 这里的事务吞吐量计算公式是: 活动线程数*1秒/一个线程的响应时间,比如当一个用户向服务器发出一个请求,在100ms后得到响应,那么事务数等于1*1000ms/100ms = 10 transcation/s,得到每秒钟可以处理是个事务数的结果。 

    JMeterPlugin 部分说明 - zhang_jing - zhang_jing的博客

     

    9  Transaction Throughput vs Threads  每活动线程数可能的事务吞吐量,途中X轴表示的是活动线程数,Y轴表示的是事务吞吐量,F(X,Y)的含义是当系统处于某个活动线程数时,系统当时的事务吞吐量是多少。比如当有10个活动线程时,事务吞吐量是100/s,而当有20个活动线程时,事务吞吐量是50/s,说明随着用户访问的增加,系统的处理效率开始下降了。从这个图中我们可以找到一个临界点,在多大的活动线程数时,系统达到最大的吞吐量。

    JMeterPlugin 部分说明 - zhang_jing - zhang_jing的博客

     

    10  Transactions per Second 每秒的事务数,X轴表示访问结束的时刻,Y轴表示访问量,F(X,Y)表示在某个结束时刻,一共有多少的访问量结束访问。

     

    JMeterPlugin 部分说明 - zhang_jing - zhang_jing的博客

     

    11  Active Threads Over Time 每秒的活动线程数, X轴表示访问的时刻,Y轴表示活动线程数,F(X,Y)表示某个时刻的活动线程数

    JMeterPlugin 部分说明 - zhang_jing - zhang_jing的博客
  • Jmeter进行分布式性能测试

    2012-07-20 11:47:35

    由于Jmeter本身的瓶颈,当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发用户就有些力不从心,甚至还会引起JAVA内存溢出的错误。要解决这个问题,可以使用分布式测试,运行多台机器运行所谓的Agent来分担JMeter自身的压力,并借此来获取更大的并发用户数,但是需要进行相关的一些修改,具体如下。
     
    1.安装 JMeter,并确定其中一台机器作为 Controller,其他的机器作为 Agent。然后运行所有 Agent 机器上的JMeter-server.bat文件——假定我们使用两台机器 192.168.0.11 192.168.0.12 作为 Agent
    Agent机器上必须安装jdk,并设置环境变量)
     
    2.Controller 机器的 %JMeter_home%/bin下,编辑 JMeter.properties remote_hosts=127.0.0.1。其中的 127.0.0.1 表示运行 JMeter Agent 的机器,这里需要修改为remote_hosts=192.168.0.11:1099,192.168.0.12:1099——其中的 1099为端口号。
     
    3、启动controller机器上的jmeter.bat,选择菜单RunRemote Start”中的192.168.0.11:10099192.168.0.121099来运行Agent
     
    4. 有时代理的机器太少,仍不能满足需要,则需要将作为Controller的电脑也当作Agent,则同样需要修改JMeter.properties文件,将ControllerIP地址写入。这时,需要打先打开Controller电脑中JMeterbin目录下的jmeter-server.bat,然后再打开JMeter.bat,此时,进入Run -> Remote Start菜单,可以看到Controller也作为远程机器进行运行。

    当远程访问时,会看到控制台上打印出一行:Starting the test on host [ip]:1099 @....,远程执行结束,会打印一行:Finished the test on host [ip]:1099 @...

    常见问题:
    1、确定在controller机器上安装jdk,版本和jmeter一致,配置环境变量:Java_home
       Agent机器上安装jdk,配置环境变量:Java_homeJMeter_home
    2
    Agent机器启动Jmeter_server.bat时,后台提示:"could not find ApacheJmeter_core.jar"
    解决方法:这个是开始没有找到ApacheJmeter_core.jar,后来去JMETER_HOME目录下去查找,最后找到了,如果不希望看到Could not find的字样,需要添加环境变量JMETER_HOME,路径为bin目录的上一级目录,这样启动jmeter-server服务时,就只会看到Found ApacheJMeter_core.jar

    3Jmeter分布式控制过程中,各个Agent启动的线程数等于线程组中的配置,不是均分线程组中的配置

    4. Jmeter安装目录不要放在例如:C:/Program Files/**,因为jmeter-server.bat不支持含空格的文件夹路径。
  • 利用JMeter进行Web测试

    2012-07-20 10:48:43

    利用JMeter进行Web测试
    JMeter介绍
    脚本录制
    运行JMeter进行测试
    JMeter主要组件介绍
    参数化设置
    动态数据关联
    使用命令行运行JMeter脚本
    利用XSLT分析JMeter结果文件

    JMeter介绍

    JMeter, 一个100%的纯Java桌面应用,它是Apache组织的开放源代码项目,它是功能和性能测试的工具。JMeter可以用于测试静态或者动态资源的性能 (文件、Servlets、Perl脚本、Java对象、数据库和查询、ftp服务器或者其他资源)。原先Jmemer是为Web/HTTP测试而设计 的,但是它已经扩展以支持各种各样的测试模块。它和用于HTTP和SQL数据库(使用JDBC)的模块一起运送。它可以用来测试静止资料库或者活动资料库 中的服务器的运行情况,可以用来模拟对服务器或者网络系统加以重负荷以测试它的抵抗力,或者用来分析不同负荷类型下的所有运行情况。它也提供了一个可替换 的界面用来定制数据显示,测试同步及测试的创建和执行。
      Jmeter的下载地址:http://jakarta.apache.org/jmeter/usermanual/index.html
      JMeter 的特性:
      a) 能够对HTTP和FTP服务器进行压力和性能测试, 也可以对任何数据库进行同样的测试(通过JDBC)。
      b) 完全的可移植性和100% 纯Java。
      c) 完全 Swing 和轻量组件支持(预编译的JAR使用 javax.swing.*)包。
      d) 完全多线程 框架允许通过多个线程并发取样和 通过单独的线程组对不同的功能同时取样。
      e) 精心的GUI设计允许快速操作和更精确的计时。
      f) 缓存和离线分析/回放测试结果。
      g) 高可扩展性:
      h) 可链接的取样器允许无限制的测试能力。
      i) 各种负载统计表和可链接的计时器可供选择。
      j) 数据分析和可视化插件提供了很好的可扩展性以及 以及个性化。
      k) 具有提供动态输入到测试的功能(包括Javascrīpt)。
      l) 支持脚本变成的取样器(在1.9.2及以上版本支持BeanShell)。

    脚本录制


    利用BadBoy进行脚本录制
    利用BadBoy录制JMeter脚本(1)
    通过Badboy的官方网站(http://www.badboy.com.au)下载Badboy的最新版本;
    安装Badboy。安装过程同一般的Windows 应用程序没有什么区别,安装完成后你可以在桌面和Windows开始菜单中看到相应的快捷方式——如果找不到,可以找一下Badboy安装目录下的Badboy.exe 文件,直接双击启动Badboy;
    启动Badboy,你可以看到下面的界面。
    利用BadBoy录制JMeter脚本(2)
    在地址栏(图中红色方框标注的部分)中输入你需要录制的Web应用的URL——这里我们以http://www.baidu.com 为例 。
    点击 开始录制 按钮(图中蓝色圆圈标注的部分)开始录制。 
    开 始录制后,你可以直接在Badboy内嵌的浏览器(主界面的右侧)中对被测应用进行操作,所有的操作都会被记录在主界面左侧的编辑窗口中(图中黄色方框标 注的部分)——在这个试验中,我们在baidu的搜索引擎中输入 JMeter 进行搜索。不过录制下来的脚本并不是一行行的代码,而是一个个Web对象——这有点像LoadRunner的VuGen中的Tree View视图; 
    录制完成后,点击工具栏中的“停止录制”按钮(图中紫色方框标注的部分),完成脚本的录制
    利用BadBoy录制JMeter脚本(3)
    选择“File -> Export to JMeter”菜单,填写文件名“baidu.jmx”,将录制好脚本导出为JMeter脚本格式。也可以选择“File -> Save”菜单保存为Badboy脚本;
    启动JMeter并打开刚刚生成的测试脚本,就可以用JMeter进行测试了

    利用JMeter的代理服务器功能进行脚本录制
    利用JMeter的代理服务器功能
    进行脚本录制(1)
    在测试计划中添加线程组,在线程组中添加逻辑控制器-录制控制器。
    在工作台中添加非测试元件-HTTP代理服务器。
    端口:即代理服务器的监听端口,我们设为8080。
    目标控制器选择:测试计划>线程组;
    分组选择:每个组放入一个新的控制器。
    在HTTP代理服务器中添加定时器-高斯随机定时器(用于告知Jmeter来在其生成的HTTP请求中自动的增加一个定时器)。定时器将会使相 应的的取样器被延迟。 延时的规则是,在上一个访问请求被响应并延时了指定的时间后,下一个被定时器影响的取样访问请求才会被发送出去。 

    如果在代理服务器元件里使用了高斯随机定时器,就应该在其中的固定延迟偏移(Constant Delay Offset)设置项里添上${T}(用于自动引用纪录的延迟时间)。
    代理服务器配置好以后,点击启动,代理服务器就会开始记录所接受的HTTP 访问请求。 
    打开浏览器,打开Internet选项,将局域网(LAN)设置中的代理服务器设为:localhost,端口为在代理服务器中设的端口:8080。
    在浏览器地址栏中输入地址并进行相关的操作进行录制,录制完成后, 停止HTTP 代理服务器; 在录制控制器元件上单击右键将记录的元件保存为一个文件用于以后重用,另外,不要忘了恢复浏览器的代理服务器设置。

    运行Jmeter进行测试(1)


    脚本录制完毕后,就可以运行JMeter来进行我们的测试了。
    到JMeter的网站http://jakarta.apache.org/site/downloads/downloads_jmeter.cgi
    下载JMeter的最新版本,将zip文件解压缩到D:/JMeter,运行D:/JMeter/bin下的jmeter.bat即可。
    打开JMeter会有一个默认的测试计划,点击文件-打开,选中录制的脚本文件如:WebXSample_addUser.jmx,打开脚本进行测试。
    在线程组上添加监听器-聚合报告(用于分析测试结果)后,点击运行-启动,开始测试,测试完毕后在聚合报告中就可以看到测试结果。一个简单的测试计划就完成了。
    聚合报告显示测试结果
    Label:每个 JMeter 的 element (例如 HTTP Request )都有一个 Name 属性,这里显示的就是 Name 属性的值 
    #Samples:表示你这次测试中一共发出了多少个请求,如果测试计划模拟10个用户,每个用户迭代10次,这里就会显示100 
    Average:平均响应时间 — 默认情况下是单个 Request 的平均响应时间,当使用了事务控制器时,也可以以事务为单位显示平均响应时间 
    Median:中位数,也就是 50 %用户的响应时间 
    90% Line: 90 %用户的响应时间
    Min:最小响应时间 
    Max:最大响应时间 
    Error%:错误率,本次测试中出现错误的请求的数量 / 请求的总数
    Throughput:吞吐量 —— 默认情况下表示每秒完成的请求数( Request per Second )
    KB/Sec:每秒从服务器端接收到的数据量
    测试计划(Test Plan)是使用 JMeter 进行测试的起点,它是其它 JMeter 测试元件的容器。
    线程组(Thread Group)代表一定数量的并发用户,它可以用来模拟并发用户发送请求。
    取样器(sampler)定义实际的请求内容,被线程组包含,我们主要用HTTP请求。
    监听器(Listener) 
    逻辑控制器(Logic Controller)
    断言(Assertions) 
    配置元件(Config Element)
    前置处理器(Pre Processors)和后置处理器(Post Processors)
    定时器(Timer)

    JMeter主要组件介绍-测试计划


    测试计划(Test Plan)是使用 JMeter 进行测试的起点,它是其它 JMeter 测试元件的容器。
    名称:你可以为你的测试计划取一个有意义的名字。
    注释:对测试计划的注释。
    用户定义的变量:用户可以自己定义变量,在用到此变量的时候直接用${变量名}引用即可。例:变量名=url,值=http://www.baidu.com,在需要http://www.baidu.com时直接用${url}即可。
    Add directory or jar to classpath:向类路径即%JMETER-HOME%\lib中添加目录及jar包。
    JMeter主要组件介绍-线程组
    名称:为线程组起名字。
    线程属性-线程数:设置发送请求的用户数目 ,即并发数。
    线程属性-Ramp-Up Period(in second):线程间的时间间隔,单位是秒。即所有线程在多少时间内启动。
    线程属性-循环次数:请求的重复次数,如果选择后面的forever(默认),那么 请求将一直继续,如果不选择forever,而在输入框中输入数字,那么请求将重复指定的次数,如果输入1,那么请求将执行一次,如果是0,会出现问题。
    调度器配置-启动时间:测试计划什么时候启动,启动延迟会覆盖它。
    调度器配置-结束时间:测试计划什么时候结束,持续时间会覆盖它。
    调度器配置-持续时间:测试计划持续多长时间,会覆盖结束时间。
    调度器配置-启动延迟:测试计划延迟多长时间启动,会覆盖启动时间。
    JMeter主要组件介绍-取样器(HTTP请求)
    名称:HTTP请求的名字。
    Web服务器-服务器名称或IP、端口号,脚本录制时自动添加,也可以使用“用户自定义变量”。
    HTTP请求:用默认值即可。
    同请求一起发送参数:请求中的参数、值可以在此设置,需要用到参数化及动态数据关联,我们在后面专门介绍。
    同请求一起发送文件:我可以制定同请求一起发送哪个文件。
    其他任务包括:从HTML文件中获取所有内含的资源、用作监视器、Embedded URLs must match
    监听器(Listener)负责收集测试结果,同时也被告知了结果显示的方式。我们常用的包括:聚合报告、查看结果树、用表格查看结果,都支持将结果数据写入文件。其他的添加上去看看就行。聚合报告前面我们介绍过,后面是查看结果树和用表格查看结果的截图。
    JMeter主要组件介绍-监听器(用表格查看结果)

    JMeter主要组件介绍-逻辑控制器

    逻辑控制器(Logic Controller)可以自定义JMeter发送请求的行为逻辑,它与Sampler结合使用可以模拟复杂的请求序列。
    循环控制器可以设置请求的循环次数或永远循环(如果选中永远的话)。
    事务控制器可以将多个请求放在同一个事务中。如果选中Gegerate parent sample,则聚合报告中只显示事务控制器的数据,而不会显示其中的各个请求的数据,反之则全部显示。

    JMeter主要组件介绍-断言

    断言(Assertions)可以用来判断请求响应的结果是否如用户所期望的。它可以用来隔离问题域,即在确保功能正确的前提下执行压力测试。这个限制对于有效的测试是非常有用的。

    JMeter主要组件介绍-配置元件


    配置元件(Config Element)维护Sampler需要的配置信息,并根据实际的需要会修改请求的内容。我们主要在参数化中用到CSV Data Set Config


    JMeter主要组件介绍-前置处理器和后置处理器

    前置处理器(Pre Processors)和后置处理器(Post Processors)负责在生成请求之前和之后完成工作。前置处理器常常用来修改请求的设置,后置处理器则常常用来处理响应的数据。我们主要在动态关联中用到后置处理器的正则表达式提取器。      

    JMeter主要组件介绍-定时器


    定时器(Timer)负责定义请求之间的延迟间隔。

    参数化设置


    在我们的测试计划中我们使用的都是HTTP请求,在HTTP请求中常常会提交一些参数,我们为了不想在每一次请求中都使用相同的参数值,就要想办法让每一次请求的参数的值都是不一样的,我们就需要进行参数化设置,这里我们介绍两种参数化设置的方法。
    一种是利用函数助手中的_Random函数进行参数化设置;
    一种是利用配置元件中的CSV Data Set Config进行参数化设置。

    参数化设置-函数助手(1)

    JMeter中有一个函数助手的功能,里面内置了多个函数,我们可以利用其中的_Random函数来进行请求中的参数化设置。
    在JMeter中选择“选项-函数助手对话框”打开函数助手对话框。
    选择一个功能_Random。
    设定最小值为1。
    设定最大值为100。
    函数名称设为func1。
    点击生成将生成一个引用字符串${_Random(1,100,func1},在需要的请求参数中拷贝该字符串即可。
    其中函数名称用来在引用中作区别,即我们可以设定不同的名称在不同的地方引用同一个函数的功能
    例如:我们生成了两个串${_Random(1,100,func1)}、 ${_Random(1,100,func2)},在添加图书的请求中,我们在bookName的参数值中引 用${_Random(1,100,func1)},在bookConcern的参数值中应用${_Random(1,100,func2)},见截图, 这样测试运行时不同的线程将产生不同的bookName和bookConcern。

    参数化设置-CSV Data Set Config(1)


    在线程组上点击右键选择添加-配置元件-CSV Data Set Config,打开CSV Data Set Config。
    Filename文件名:即参数化要引用的文件名。这里是d:\number.txt
    File encoding文件编码:可以不填。
    Variable Names(comma-delimited)变量名(用逗号分割):多个变量可以引用同一个文件,用逗号分割。这里是num1,num2
    Delimiter(use ‘\t’ for tab):参数文件中多个变量值的分隔符,\t表示用tab键分割,默认是逗号。
    Recycle on EOF?:结束后是否循环?默认是True.
    Number.txt文件内容见截图。

    参数化设置-CSV Data Set Config(2)


    在添加图书的请求中,我们在bookName的参数值中引用${num1},在bookConcern的参数值中应用${num2},见截图,这样测试运行时不同的线程将产生不同的bookName和bookConcern。

    动态数据关联

    在HTTP请求的参数中经常会遇到一些参数的值是从服务器相应的动态数据,这些数据需要进行关联才能使得每一次请求都能成功得被服务器接受,在JMeter中采用正则表达式提取器来获取这些动态的数据。
    正则表达式允许用户从服务器响应中获取数据,作为一个后置处理器,正则表达式提取器会在每一个请求执行后再执行,正则表达式提取请求的参数值,产生模板字符串,并将结果保存到给出的变量中。

    动态数据关联(1)-正则表达式提取器


    在HTTP请求的参数中经常会遇到一些参数的值是从服务器相应的动态数据,这些数据需要进行关联才能 使得每一次请求都能成功得被服务器接受,在JMeter中采用正则表达式提取器来获取这些动态的数据。比如我们想要获得从服务器相应的TOKEN,就可以 使用下面的正则表达式提取器。
    使用时就可以使用${token_g1}来表示获取到的TOKEN值。如下图:

    使用命令行运行JMeter脚本


    JMeter -n -t my_test.jmx -l log.jtl
    -n告知JMeter采用非图形化运行JMeter脚本
    -t指定要运行的脚本文件
    -l指定保存执行结果的文件名
    执行命令前要检查当前目录是否是%JMeter_Home%\bin 目录;
    如果 JMeter 脚本不在当前目录,需要指定完整的路径;如果要把执行的结果保存在其他地方也要指定完整的路径。

    利用XSLT分析JMeter结果文件(1)


    将结果文件的扩展名改为xml,例:将log.jtl改为log.xml。
    在log.xml的文件头
    <?xml version="1.0" encoding="UTF-8"?>
    <testResults version="1.2">
    中添加
    <?xml-stylesheet type=“text/xsl” href=“jmeter-results-report.xsl” ?>
    使之变成
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="jmeter-results-report.xsl" ?>
    <testResults version="1.2">
    其中href指定xsl文件的路径,如果与xml文件在同一目录,则只写文件名即可,否则要写明详细路径。
    利用XSLT分析JMeter结果文件(2)
    将修改后的xml文件用浏览器打开即可得到统计结果
    JMeter中进行分布式测试
    作为一个纯 JAVA 的GUI应用,JMeter对于CPU和内存的消耗还是很惊人的,所以当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发用户就有些力不从心, 甚至还会引起JAVA内存溢出的错误。不过,JMeter也可以像 LoadRunner 一样通过使用多台机器运行所谓的代理来分担负载产生器自身的压力,并借此来获取更大的并发用户数,我们只需手动配置一下即可。
    1、在所有期望运行 JMeter作为 负载产生器的机器上安装JMeter,并确定其中一台机器作为 控制器,其他的机器作为 代理。然后运行所有 代理 机器上的JMeter-server.bat文件—假定我们使用两台机器172.20.80.47和172.20.80.68作为 代理;
    2、在Controller 机器的JMeter安装目录下找到 bin 目录,再找到 jmeter.properties 这个文件,使用记事本或者其他文字编辑工具打开它;
    3、 在打开的文件中查找“remote_hosts=”这个字符串,你可以找到这样一行“remote_hosts=127.0.0.1”。其中的 127.0..0.1 表示运行JMeter代理的机器,这里需要修改为“remote_hosts=172.20.80.47,172.20.80.68”;
    4、保存文件,并重新启动控制器机器上的JMeter,并进入启动 ->远程启动菜单项。就会看到我们刚才添加的两个代理的地址,选中即可运行,如果想同时启动所有代理,选择远程全部启动即可。
    要进行分布式测试代理机器上需要添加环境变量,即添加用户变量JMETER_HOME=d:\jmeter,系统变量中的path中添加d:\jmeter\bin(假设jmeter放在d盘根目录下)。
  • 远程linux启动jmeter,执行./jmeter.sh报错之解决方法

    2012-07-16 15:20:33

    远程linux启动jmeter,执行./jmeter.sh报错:
    1、java: command not found
    需配置java环境

    环境变量配置

    vi /etc/profile

    增加以下3行。

    JAVA_HOMEJDK的安装目录。

    export JAVA_HOME=/usr/local/platform/jdk1.6.0_22

    export PATH=$JAVA_HOME/bin:$PATH

    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

    然后在执行:source /etc/profile

    验证是否正确命令:java -version

    2、An error occurred:
    No X11 DISPLAY variable was set, but this program performed an operation which requires it.
    步骤一:linux负载机环境下,切换到root用户,运行以下命令安装X11,该linux机器需能访问外网

    yum -y install xorg-x11-xauth

    yum install xorg-x11-server-utils

    yum install xorg-x11-server-Xnest

    yum install libXtst

    安装完成后再重新登录,提示/usr/bin/xauth:  creating new authority file /home/upload/.Xauthority

    步骤二:本地机器安装Xming-6-9-0-31-setup.exe,安装成功后并运行。

    步骤三:本地机器安装puttyputty进行如下配置,选择SSH>X11,选中Enable X11 forwardingX display location中填写:localhost:0




  • 启动jmeter内存溢出的解决方法

    2012-07-12 14:48:22

    启动jmeter内存溢出的解决方法:
    提示 An error occurred: PermGen space
    Uncaught Exception java.lang.OutOfMemoryError: PermGen space. See log file for details.

    linux环境,修改jmeter.sh
    下面添加如下配置:
    java $JVM_ARGS -Xms1G -Xmx5G -XX:MaxPermSize=512m -Dapple.laf.useScreenMenuBar=true -jar `dirname $0`/ApacheJMeter.jar "$@"
    一般根据实际情况修改-Xmx5G,由小改到大。
    windows环境,修改jmeter.bat
    set HEAP=-Xms256m -Xmx256m
    set NEW=-XX:NewSize=128m -XX:MaxNewSize=128m
    改为:
    set HEAP=-Xms256m -Xmx1024m
    set NEW=-XX:NewSize=128m -XX:MaxNewSize=512m
  • jmeter正则表达式提取器

    2012-04-16 15:15:07

    从 Response 中获得数据操作步骤:
    1、可以使用 JMeter 提供的 后置处理器(Post Processers) --> 正则表达式提取器 (Regular Expression Extractor) 从返回的结果中取得数据, 在确定 getToken() 请求的返回值是类似下列的 XML 之后,
    <?xml version="1.0" encoding="utf-8"?><burlap:reply xmlns:burlap="http://www.amowa.net/burlap/"> <string>TK1119466440468</string></burlap:reply>
    我们可以使用正则表达式 "<string>(.*)<\/string>" 来提取我们需要的凭证号.
     
    <PropertyRoomTypeID>(.+?)<\/PropertyRoomTypeID>
     
    2、这样使用"正则表达式提取器"(如下图), 注意图中的"引用名称"就可以认为是存放提取出来的数据的变量名:
    3、提取出来的变量可以这样被引用(如下图)

    Jmeter正则表达式详解:
    1、提取单个字符串:
    假设测试人员期望匹配Web页面的如下部分:name = "file" value = "readme.txt">并提取readme.txt。
    一个符合要求的正则表达式:name = "file" value = "(.+?)">。
    ():封装了待返回的匹配字符串。
    .:匹配任何字符串。
    +:一次或多次。
    ?:不要太贪婪,在找到第一个匹配项后停止。
     
    2、提取多个字符串:
    假设测试人员期望匹配Web页面的如下部分:name = "file" value = "readme.txt">并提取file和readme.txt。
    一个符合要求的正则表达式:name = "(.+?)" value = "(.+?)"。
    引用名称:MYREF
    模板:$1$$2$
    如下变量的值将会被设定:
    MYREF_g0:name = "file"value = "readme.txt"
    MYREF_g1:file
    MYREF_g2:readme.txt
    引用${MYREF_g1}
     
    3、
    引用名称即使用的参数名;填入正则表达式;模板选取匹配的组;匹配数字为匹配的个数,负数表示全部匹配;缺省值为没有匹配到时的取值。
    提取到的参数,调用时用${product_id_1},${product_id_2},${product_id_3}……;
    如果想要得到匹配出的参数的个数,用${product_id_matchNr};如果想随机选取其中一个,只需将匹配数字设为0,使用${product_id}调用即可。
    可以一次匹配多组;示例中只匹配了一个,假如正则表达式为 name="chkProductIds"
    id="chk(.+?)" value="(.+?)",就会有两组参数。想获得匹配到的组个数用${product_id_g}。模
    板针对的是匹配到的字符串再做组的区分,比如希望${product_id}取出的是第二组参数的
    值,用$2$。


     
  • 使用jmeter测试mysql数据库

    2012-04-06 14:43:30

    1、添加并发用户,即添加线程组,并修改其默认配置。

    2、选中线程组,单击鼠标右键,选择ADD->配置元件->JDBC Connection Configuration,配置如附图:

    3、再次选中线程组,单击鼠标右键,选择ADD->Sampler->JDBC Request,修改名称,输入连接池的名称MySql(与JDBC配置元件的名称相同),输入SQL查询语句。

    4、添加监听器用于查看/存储测试结果。