服务器网站别名设置,成都百度爱采购,安庆网络推广公司,wordpress 腾讯地图导语
JMeter是由著名开源软件巨头Apache组织开发的纯Java的压力测试工具#xff0c;它即能测试动态服务#xff08;WebService#xff09;#xff0c;也能测试静态资源#xff0c;包括Servlet服务、CGI脚本等#xff0c;还能测试动态语言服务#xff08;PHP、Java、ASP…导语
JMeter是由著名开源软件巨头Apache组织开发的纯Java的压力测试工具它即能测试动态服务WebService也能测试静态资源包括Servlet服务、CGI脚本等还能测试动态语言服务PHP、Java、ASP.NET等和数据库和FTP服务测试结束之后能够根据测试的脚本配置和服务器配置情况生成可视化的测试报告图表。本文以测试基于HTTP请求的WebService服务为例进行讲解。
1. 环境与配置
下载安装
JMeter的使用十分简单下载之后如果是Windows系统运行bin目录中的jmeter.bat即可如果是UNIX-like系统运行jmeter.sh即可。
另外JMeter还支持以命令行方式运行。一般的命令方法是这样的
jmeter.sh -n -t test_plan.jmx -l output_log.jtl
-n 通知JMeter以非GUI方式运行 -t 指定将要运行的测试计划测试计划本质上一个XML文件 -l 指定测试结果集输出文件这个文件本质上是一个CSV文件 如果以命令行方式运行需要修改bin目录中的jmeter.properties文件中的jmeterengine.force.system.exit这个选项原因是以命令行方式运行时是无法对GUI窗口执行关闭操作的这会导致UI线程永远都不会退出这种线程死锁的情况会被JMeter认为是异常而报错。
JMeter运行时会创建日志对于未开启UAC的Windows用户操作没有任何影响日志文件是保存在bin目录中的也就是说是和jmeter.bat文件保存在一起的可是对已经开启了UAC的用户来说如果选择以管理员权限运行jmeter.bat并且启动了凭证验证机制那么日志文件将不会与jmeter.bat保存在一起因为Windows下的bat文件是被cmd.exe命令提示符Windows的命令行Shell程序所解析和执行的而cmd.exe这个程序是在C:\Windows\System32这个目录下的我们假定你的系统安装在C盘所以启动程序的进程上下文环境发生了变化所以日志文件也会保存在C:\Windows\System32这个目录中更严重的在某些情况下会因为CLASSPATH配置与JMeter运行环境出现不一致而导致找不到相应的Jar包出现java.lang.ClassNotFoundException。事实上这个问题是可以被处理的所以可以认为这是jmeter.bat程序的一个BUG。
关于什么是UAC官方有详细介绍请点击这里查看点击这里还可以看到一个更简单的介绍和说明。
环境要求
JMeter 3.0于今年5月中旬发布与之前的版本不同这个版本明确要求JDK 1.7以上版本的支持推荐使用JDK1.8版本并且这个版本的JMeter中使用的Apache HttpClient库的版本也已经更新到了4.5.2。
如果用户使用JMeter 2.10或者更早的版本那么JMeter中集成的是HttpClient库的3.1甚至更低的版本此时如果被测试的Java请求是使用HttpClient库的4.5及以上版本编译的那么运行时会出现莫名其妙的网络错误这是因为HttpClient库的版本不兼容造成的解决方法是在自己引用的Java请求中使用HttpClient3.1版本和JMeter保持一致。然而推荐的方式是改用JMeter3.0以上版本因为官方已经明确声明自JMeter3.0起HttpClient3.1的版本兼容性支持将被废弃。
JMeter3.0以上版本提供了许多新功能修复了性能上的几个问题而且HttpClient4.5以上版本也改进了一些功能修复了退出时持久连接未关闭的BUG改进了对HTTPS的支持。
2. 执行测试
几个概念
测试计划也就是Test Plan是整个测试任务管理的顶级单位所有的对于测试任务的配置都是放在测试计划中的。这就好像一个根目录一样所有的文件和数据都是保存到这个根目录之下的。
线程组也就是Thread Group是可以被独立调试、执行和调度的独立单元一个测试计划中可以有多个线程组每个线程组可以配置并发用户数、运行次数、并发加压强度、定时任务等参数。
取样器也就是Sampler是一个HTTP请求的所有逻辑关系承载在这一个取样器中可以配置请求目标服务器的主域名、请求路径、参数、请求头信息、客户端Cookie策略等。
监听器也就是Listener是对测试过程和测试数据的收集机制最常用的是聚合报告Aggregate Report和 逻辑控制器也就是Logic Controller在这里可以配置多个取样器的控制逻辑比如我们通常都会有登录服务只访问一次而数据服务或者查询服务要访问多次此时可以通过只访问一次登录接口然后根据需求对数据服务或者查询服务进行压力测试的方式完成。
配置元件也就是Config Element这里最常用的功能是对HTTP请求的DNS策略、缓存策略、Cookies策略、Header信息、认证机制等信息进行配置对于需要实现请求参数化的还可以使用CSV Data Set Config功能。
配置任务
创建一个线程组在TestPlan上点击右键选择Add-Threads(Users)-Thread Group即可完成一个线程组的创建。
并发数在Number of Threads(users)中设置设置更多的用户将需要更多的内存一般情况下如果并发数设置为1000循环数设置为10运行时需要的内存将会再700MB到1GB左右在此数值之上时需要对JVM进行调优否则有可能因为JVM或者测试机器性能问题导致测试数据不准确甚至有可能导致JMeter无响应造成任务失败。
集合点在Ramp-Up Period(in seconds)中设置这里可以控制加压强度这个设置项的意义是多少秒之内完成所有用户的加压在此处设置一个恰当的值再勾选设置项Scheduler然后设置其中的Startup delay(seconds)选项即可完成集合点的设置。从而达到每n个用户一起并发请求这样的效果。
循环数设置Loop Count即可如果勾选了Forever就是永远运行除非用户手动停止。如果是在命令行上运行的测试计划并且启用了这个选项只能使用CTRLC强行中止如果任务是被使用类似于nohup这样的方式运行在后台的只能强制杀死进程完成退出操作不过这种方式下不用担心测试数据丢失因为JMeter对测试数据的输出和保存是实时的。
检查点设置检查点之前需要先为线程组添加一个取样器我们以HTTP Sampler为例在线程组上点击右键选择Add-Sampler-HTTP Request即可取样器添加完成之后需要先对此取样器设置主域名访问路径内容编码超时时间、提交参数等诸多信息和参数。配置完成之后在此取样器上点击右键选择Add-Assertion-Response Assertion然后对这个响应断言进行设置它支持Contains包含、Matches匹配、Substring子字符串、Not非运算四种方式。特别的我们不需要对Patterns to Test中的内容进行字符转义。
参数化待完善。
配置其他测试选项最常用的其他测试选项是HTTP Request的头信息通过这个功能可以设置HTTP请求提交时的Header信息和参数设置方法是在取样器上点击Add-Config Element-HTTP Header Manager然后就可以添加一个HTTP头信息管理器然后添加若干参数用于提交HTTP请求时提交到服务器。
执行测试
单个执行在线程组上点击右键选择Start即可按照此线程组设置的并发数的循环数启动此线程组进行测试。
验证执行这个功能是JMeter3.0之后才有的功能在线程组上点击右键选择Validate即可运行一次无论并发数和循环数是多少只运行一次可以在修改参数之后快速验证此线程组是否正确。
部分执行当一个测试计划中有多个线程组的时候可以按住CTRL键单个选择或取消选择也可以按住SHIFT键连续选择多个线程组选择了自己想要执行的线程组之后在被选择的多个线程组的任意一个上点击右键选择Start即可执行被选择的线程组这些线程组会按设置的所有参数立即启动。
全量执行在测试计划上点击左键选中它然后点击命令栏的Start按钮或者菜单Run-Start命令或者按下CTRLR快捷键都会立即启动整个测试计划下的所有线程组开始执行测试任务。
服务器监控
先介绍几个最常用的服务器状态监控工具 top Linux自带的经典的系统性能情况查看工具
htop 这是一个第三方工具用C语言写成需要下载、编译和安装是top命令的改进版本功能十分强大视觉效果很好 glances这是类似于htop的一个工具使用Python写成需要Python3.4以上版本的支持通过Python的pip3即可一键完成安装和htop一样功能强大、视觉效果很好 free Linux自带的命令用于查看内存状态 vmstat Linux组件用于快速查看系统的性能状态信息 nmon 这是一个第三方工具绿色免安装使用C语言写成它的原理是轮询和收集/proc下的系统运行信息然后进行分析整理所以需要nmonChart的配合可以生成十分直观和漂亮的性能图表并且通过配置可以实现动态分析和在线查看。老版本的nmon会生成一个带有VB宏的Excel文档然后下载下来之后必须使用Excel打开并且必须启用宏功能这种方式既不安全也很麻烦已经被淘汰了。
iftop 这是一个第三方工具需要下载并且编译安装才能使用iftop工具最新版本0.17的安装文件中对依赖包没有处理所以如果编译失败需要我们手动检查libpcap、libpcap-devel、ncurses、ncurses-devel这几个依赖包是否正确安装安装完毕直接输入iftop即可启动可以非常直观地看到网络设备的连接速度情况。
分析结果
基础分析和查看要想快速查看测试任务执行情况需要对每一个取样器都配置结果树和断言结果操作方法很简单在取样器上点击右键选择Add-Listener-Assertion Result即可添加一个断言结果这种情况下对每一次请求结果的断言检查是否成功会立即看到当然如果断言失败这条测试用例也就失败了。添加结果树的方法同样简单在取样器上点击右键选择Add-Listner-View Results Tree即可添加结果查看器的好处很多可以看到取样器的每一次请求的提交参数、时间等所有信息以及响应结果便于深入细致的分析测试执行情况和成功与失败的原因。 综合查看综合查看结果需要添加聚合报告操作方法是在线程组中点击右键选择Add-Listner-Aggregate Report添加聚合报告的好处是能够查看到此线程组下的所有取样器的执行次数平时时间、中值时间、最大时间、最小时间、失败率、吞吐量等非常实用的测试数据。
3. 其他细节问题
1)将测试结果保存到Excel表格
Excel表格具有非常强大的数据分析和统计汇总能力将海量的测试数据导出到Excel表格是非常实用的操作很简单在线程组上点击右键选择Add-Listner-View Results in Table然后在Write results to file /Read from file中的Filename中填入一个指定的文件名即可文件的扩展名最好是CSV这样可以直接使用Excel打开。
2)全局分析
有多个线程组时逐个分析比较麻烦也不利于效率提升只需要在TestPlan上点击右键选择Add-Listner-Aggregate Report即可对整个测试计划的所有线程组的测试执行情况一目了然非常方便和实用对于测试结果集还可以点击Save Table Data将它保存到CSV文件中然后直接用Excel打开可以很快的自动转换成十分漂亮的图表。
4. 横向对比
1) 与Apache HTTP Server的ab工具对比
不同之处
ab工具对配置HTTP请求头状态、GET参数、POST提供数据和PUT提交文件操作不够直观
ab工具对HTTPS的支持需要单独编译的版本默认的版本是不支持的而ab工具并不能单独编译因为它使用了Apache Portable RuntimeAPR可移植运行时库中的源码所以需要将整个Apache HTTP Server全部下载下来并且配置环境才能完成编译使用门槛较高。
ab工具仅支持命令行模式JMeter同时支持GUI模式和命令行模式但是GUI模式需要消耗更多资源
ab工具效率和性能比JMeter高很多所以对测试任务机要求低
ab工具的最大请求数不能超过50000
参数化、集合点、检查点这几大功能方面JMeter要比ab工具强大的多
相同之处
都可以对测试结果生成CSV文件都可以很方便的配置HTTP KeepAlive特性都提供了跨平台级的支持都对测试结果集的收集和分析做的很好
2) 与LoadRunner对比
不同之处
LoadRunner是一个非常庞大的工具功能比JMeter要强大操作也更加复杂适合于专门长期从事性能测试领域的应用和研究
LoadRunner是商业软件有价格不菲的授权许可费用JMeter是开源软件
LoadRunner有比JMeter更加详细和庞大的文档系统为完成复杂的测试任务提供了强有力的支持
LoadRunner由三大组件VuGen、Controllor、Analysis组成JMeter是一个整体没有做这样的拆分
LoadRunner的测试分析功能比JMeter要强大的多
LoadRunner对测试任务机的要求比JMeter要高出很多
LoadRunner不仅支持Java扩展更支持强大C扩展对测试脚本的可定制性比JMeter要复杂和强大
相同之处
都支持在Windows和Linux平台上运行测试任务都具备设置集合点、检查点、参数化特性
5. 未来展望下一个版本
1)将会提供对MQTT的支持
MQTTMessage Queuing Telemetry Transport消息队列遥测传输并不是一门新技校它是由IBM开发的一套面向M2MMachine-to-Machine的即时通信协议基于TCP/IP的连接实现所以它几乎支持所有平台未来可能会成为物联网的一部分。
2)修复和改进
高分屏下的显示优化、文档改进、图片压缩、Label扫描优化。
6. 附加信息
1)JMeter的运行原理分析
JMeter模拟多用户并发使用的JDK的线程模式而且JDK的线程模式都是一堆native方法它是JDK的C语言实现中根据不同的系统做出的处理在Windows上最后会转为调用C标准库在Linux上最后转为pthread库所以当JMeter正在运行时可以查看到它所依存的java进程的线程数量。
JMeter的代码量十分庞大经过多年积累本身的逻辑和体系结构也十分完善它支持Web、HTTP、HTTPS、SOAP/REST、FTP、JDBC、LDAP、JMS、TCP、SMTP、POP3、IMAP甚至支持Native模式的Shell脚本GUI图表库使用的不是AWT也不是SWT而是Swing界面显示优美控件功能丰富。因此JMeter拥有一整套完整的类管理机制和接口。
JMeter还拥有很强的二次开发和扩展能力因此甚至有团队用它来做回归测试而不是仅仅是性能和压力测试。
JMeter官方文档说的很清楚JMeter不是一个浏览器它不会解析HTML文档也不会执行JS脚本。
JMeter还支持BeanShell。
JMeter对HTTP协议的Response无论是JSON还是XML都能正确的解析。
JMeter的一堆properties文件中有数量庞大的定制参数通过这些功能可以实现更多可定制化的任务和需求。
JMeter还支持部署为集群服务器任务执行超大规模的测试任务。
2)Apache ab工具的运行原理分析
ab工具使用C语言写成但是它不是一个独立的项目而是著名的httpd服务器项目的一个组件。它复用了APR的内存池技术因此不会有频繁的内存申请和销毁动作所以从基础设计上就保证了高并发测试任务的高效执行同时又能有效避免内存泄漏或者溢出。
ab工具使用C语言写成但是它不是一个独立的项目而是著名的httpd服务器项目的一个组件。它复用了APR的内存池技术因此不会有频繁的内存申请和销毁动作所以从基础设计上就保证了高并发测试任务的高效执行同时又能有效避免内存泄漏或者溢出。
Apache ab工具使用的是多路模式依赖于创建非阻塞式的socket以Poll的方式实现pollset设计是一种优秀的设计方案它不光是为了socket还可以是file。关键函数的原型是
static void start_connect(struct connection * c);
关于这个函数程序会依据并发数和执行次数对I/O实现多路复用而且是用的多层循环遍历和递归的方式。通常情况下软件开发时如果同时在一个函数中使用过多的循环嵌套和递归会导致程序性能下降甚至栈溢出如果在这种情况下再大量使用全局变量整个项目代码就会变的不可控而ab却反其道而行之在内存池的基础上引入这种机制实现了对非阻塞式socket的快速创建和遍历操作然后再使用事件回调机制收集和处理结果从而十分巧妙的同时实现了低内存、高并发、低CPU的目标保证了极高的性能和效率。所以网络上大量流传许多贴子说的ab工具是使用多线程模拟并发的结论是错误的它是单进程单线程的工作模式至于多线程那已经是系统底层对异步socket的处理了和ab工具是否是多线程并没有什么关系。程序运行之初它调用下面的代码完成内存池的初始化
apr_pool_create(cntxt, NULL);
cntxt的类型是apr_pool_t这是一个结构体在所有测试完成之后再次调用下面的代码完成内存池的释放
apr_pool_destroy(cntxt);
它支持一堆复杂的命令行参数调用然后根据这些参数配置选项程序运行之初会在内存中创建几个十分重要的数据结构
connection结构体HTTP请求实例数据结构它包含与请求相关的关键数据比如内存池管理实例ctx、Socket对象aprsock、Poll集合的描述对象实例pollfd以及请求本身相关的状态、时间、缓冲区大小、keep-alive等具体的详细介绍请继续往下看。
apr_pool_t结构体这是内存池的管理实例每一个HTTP请求都会产生这样一个实例 apr_socket_t结构体包括自己内存池管理实例、socket类型、协议、本地地址、远程地址、端口号、是否阻塞方式、超时时间等调用选项。
apr_pollfd_t结构体pollset的描述在ab工具中会定义多个指向这个结构体数据结构的指针在底层处理中这些数据会生成一个链表。包括类型、请求事件标记、接收事件标记、Poll描述信息、当前调用者的上下文信息等。这个结构体中还有reqevents和rtnevents两个成员是内核态和用户态轮询I/O状态和回调时用的事件句柄。
apr_size_t也就是C语言中的size_t无符号整型保存当前HTTP请求在
apr_socket_recv上完成的大小信息。
apr_time_t本质上是一个apr_int64_t也就是long类型保存请求时间相关的毫秒级的时间包括启动时间、连接时间、请求写入时间、读取完成时间、请求完成时间引用的是timestamp机制。
data结构体保存的是连接时间相关的所有数据主要是启动时间、请求发出和读取响应之间的间隔时长请求连接成功的时间、整个连续所花费的时间、各连接之间的间隔时间。与这个结构体紧密绑定的还有几个compare函数是用来处理测试结果的时候做数据比较用的。
apr_int64_t对C语言中long类型的包装。
request这是一个全局变量指向大小为8192个char的数组的指针里面保存的是HTTP请求的响应头信息比如HTTP/1.0、Keep-Alive、Content-type等。
apr_pollset_tpollset对象pollset是一组socket的集合。
apr_sockaddr_tHTTP请求的socket相关的数据结构。
简单的讲ab工具中大量使用了APR中的数据结构这些数据结构是Apache根据需要对C语言的数据类型、网络、I/O、以及一些系统调用的再封装完整的数据结构文档及其应用方法可以在这里看到更加细致的网络相关的接口使用方法还需要参考《Unix网络编程第1卷》这本书的Chapter 6中作者详细介绍了五种I/O模型及其使用方法。
3)nmon工具的运行原理分析
nmon的原理比较简单全部依赖于C语言标准库和Linux系统的内核文件系统/proc没有第三方库的支持。程序运行之初针对CPU、内存、硬盘、网络这些设备分别定义了不同的函数解析它们的内核参数和系统信息然后创建一个主循环去轮询这些系统信息并将结果输出到指定的设备中去使用最多的库函数就是curses函数mvwprintw获取到数据之后以特定的方式组织起来保存到一个文本文件中去对于这个保存的文件使用nmonchart可以很轻松的将它转换成一个漂亮的HTML文档。
curses函数库是Linux下基于文本模式使用的图形函数库它的出现使得即使是文本模式下的Linux界面也可以有非常漂亮的输出和显示它可以很自由的定义输出的目标设备、颜色、形状等众多的特性。不同的Linux版本对curses的支持有所不同所以当你下载下来nmon之后会发现它针对不同发行版的Linux有不同的运行程序没关系我们只需要保留我们想要使用的比如CentOS其他的一律删除即可它们之间没有依赖关系只需要一个主程序就可以运行了。执行服务器性能测试时nmon工具几乎是必不可少的而nmon又有一堆参数需要配置这种情况下我们可以把整个命令行和参数写到一个Shell脚本中需要执行测试时只需要修改少量的几个关键参数然后运行这个脚本即可如果再自动调用nmonchart然后将结果输出到HTTP服务器上我们就可随时随地的动态的查看服务器的性能表现了。
4)结束语
这篇文档是我这两个星期执行性能测试以来的一些分析研究和总结归纳整理出来供以后需要的同学研究使用这样可以免去大家百度和谷歌的时间提升工作效率同时也是我们本身工作的一种积累和归档希望能为后来人提供一些参考和借鉴鉴于本人学识有限文中如有错误敬请谅解。
最后感谢每一个认真阅读我文章的人礼尚往来总是要有的虽然不是什么很值钱的东西如果你用得到的话可以直接拿走 这些资料对于【软件测试】的朋友来说应该是最全面最完整的备战仓库这个仓库也陪伴上万个测试工程师们走过最艰难的路程希望也能帮助到你