这篇教程讨论的是JMeter,它是一款基于Java的、集合了几个应用程序、具备特定用途的负载和性能测试工具。html
本篇主要涉及的内容:java
全部的例子都是基于Java 8 update 0.20,Eclipse Luna 4.4, JMeter 2.11, MySQL Community Server 5.6.21的开发环境。那咱们就开始吧!node
引言
采用的技术
教程内容简介
安装
用户界面
可用的请求
测试计划和测试组件
执行顺序
启动与中止
HTTP请求的测试计划
MySQL测试计划
JUnit Request测试计划
记录测试
插件
最佳实践
总结
下载
资源mysql
JMeter使用了不一样技术和协议,是一款能够进行配置和执行负载测试、性能测试和压力测试的工具。web
它可以模拟不一样类型的请求,例如各类类型的数据库,FTP, HTTP, HTTPS 或者其余的服务端应用。ajax
最好先来了解一下以下概念:正则表达式
JMeter最初的用途是用来测试web应用的,可是它的功能已获得扩展,现在已经能够针对绝大部分的程序进行测试,同时能够在你的程序中进行功能测试。sql
JMeter是一款Java桌面应用程序,它的用户界面采用Swing Java API实现。基于这两点,JMeter是一个跨平台工具,可以运行在任何安装了Java虚拟机的操做系统(Windows, Linux, Mac)的设备上。
它的框架支持并发和多线程或者线程组的执行。这对于配置负载测试和压力测试很是有用。
它是可扩展的,提供了大量的可用插件。
JMeter是Apache软件基金会下的一个子项目,是彻底免费和开源的(http://www.apache.org/licenses/)。shell
这篇文章是针对那些没有JMeter使用经验的开发人员和软件设计人员,介绍如何使用JMeter的教程。数据库
同时针对可能不一样的配置和测试计划,提供了一些例子和使用说明。在下一个章节中,咱们将会看到如何安装JMeter,并配置、运行它,如何保存和分析不一样测试计划的结果。
为了JMeter在你的电脑上安装并运行,你须要按照以下步骤进行操做:
1 | JAVA_HOME=C:\Program Files\Java\jdk1.8.0_20 |
注意设置正确你的Java版本。
而后测试java环境在你的设备上是否安装成功,使用以下命令行:
1 | java -version |
应该输出相似以下信息:
1
2
3
|
java version"1.8.0_20"
Java(TM) SE Runtime Environment (build1.8.0_20-b26)
Java HotSpot(TM)64-Bit Server VM (build25.20-b23, mixed mode)
|
1
2
3
4
5
6
7
8
|
apache-jmeter-2.9
apache-jmeter-2.9bin
apache-jmeter-2.9docs
apache-jmeter-2.9extras
apache-jmeter-2.9lib
apache-jmeter-2.9libext
apache-jmeter-2.9libjunit
apache-jmeter-2.9printable_docs
|
JMeter的GUI很是直观易用。有文件处理的通用菜单,例如:新建,打开,保存,另存为等。还有启动和中止测试计划,配置的可用的菜单项。每个测试计划,线程组,测试计划节点(咱们将会在下一章看到更多这方面的内容)均可以经过点击鼠标右键,提供不一样的上下文菜单选项。
也能够改变用户界面的语言,有许多语言可供选择。
正如咱们所说的,图形用户界面是很是直观和易用的,为每一个菜单和动做提供了易用理解的工具提示。除此以外,暂且不谈它的质量,那为何JMeter是如此普遍使用?由于它很容易理解,而且易学。
JMeter几乎提供任何一种系统的测试配置。总的来讲,下列协议被包含在内:
基本上,使用JMeter能够进行以下操做:建立,配置,执行测试计划及结果分析。测试计划是对已配置的本地或远程服务器(或客户端)的请求集执行的具体说明。
在一个测试计划的配置中,你能够指定多个输入和输出参数,能够配置使测试计划成功执行或失败的基本条件。
JMeter测试计划是由不一样的组件组成。这里有一个最重要组件的列表,指导你如何使用JMeter的用户界面添加它们以及这些插件的做用:
一个线程组基本上是不一样的测试计划元素的组合,它是一个测试计划的核心,它控制着基本核心参数。
为了建立一个测试计划,首先你不得不去建立一个线程组,配置以下参数:线程数量,过渡时期,循环次数和正常状况或者错误状况下的行为:
一个线程组也有配置选项的开始和结束时间。经过单击复选框“Scheduler”,弹出带有调度参数的面板,能够为你的测试配置开始和结束时间。
一旦配置完成,你就能够开始添加其余测试计划元素到线程组,例如采样器,侦听器和定时器。咱们将在下一章解释这一切。
采样器用于发送请求到不一样类型的服务器。它们是每个测试计划的基本要素,一切都围绕这些采样器而工做:采样器执行请求(基于配置的请求),这些请求产生一个或多个响应,后续将被分析。
这里有一个在JMeter可用的采样器列表(在本教程咱们将看到其中一些):
在上面的列表中咱们能够看到,有不少不一样类型的采样器。这个清单是不完整的,由于存在多种其余不一样于JMeter插件的实现技术。每一个采样器的配置取决于它所执行的请求;这意味着一些采样器有一些共性的配置,而另一些采样器因为它们各自请求的不一样而彻底不一样。
逻辑控制器容许你配置一个线程组内不一样采样器的执行顺序。该列表包含了在JMeter全部可用的逻辑控制器:
监听器提供不一样的方式查看由采样器请求产生的结果。监听器以报表、树型结构、或简明的日志文件的形式分析结果。
还能够在测试计划中的任何地方添加监听器,但他们只会在各自的应用范围内解析和收集来自采样器的数据。
这些都是JMeter可用的监听器:
可使用定时器来定义请求之间的等待时间。若是不指定,JMeter会一个请求完成后当即执行下一个请求,没有任何等待时间。
可在JMeter使用的计时器以下:
断言经过验证采样器请求产生的响应,来验证测试计划的有效性。它基本上相似于单元测试断言,用来检测被测试应用程序的响应质量。你能够为每一个测试计划配置任何生效的断言。
这里是一个在JMeter可使用的断言列表:
经过使用配置元素你能够将不一样的参数传递给取样器请求。他们提供了建立变量(不一样的和动态的)的一种方式,这些参数以后被采样器所使用。在采样器被执行前,参数所属节点启动时,这些参数被执行;这就是为何采样器能够依赖这些变量。
这里是一个在JMeter使用的全部配置节点列表:
在采样器执行前,前置处理器被触发。他们可用于从响应中提取变量,这些变量后续将经过配置元素被采样器所使用。
下面都是能够用来做为前置处理器的元素:
后置处理器是取样器被执行后被触发执行的元素。他可用于解析响应数据,提取变量,以便后续使用
下列元素可用于后置处理器:
测试计划的元素是有序的,经过如下方式执行:
1–配置节点
2–前置处理器
3–定时器
4–取样器
5–后置处理器(只在有结果可用状况下执行)
6–断言(只在有结果可用状况下执行)
7–监听器(只在有结果可用状况下执行)
一个测试计划能够包含一个或多个测试计划。经过功能性或者技术逻辑将测试组织在一块儿是一种常见的作法。
运行一个测试计划,你只须要点击“play”按钮:
点击按钮“Play no pauses”,开始一个测试并忽略全部暂停:
经过点击“中止”按钮,能够中止测试:
也能够禁用执行测试计划。你只须要“切换”的测试计划的状态:
你能够看到在上面的截图中看到,不可执行的计划呈现灰色,但能够修改他们或从新配置。
在这一章中,咱们将看到如何建立一个经过HTTP测试一个特定的网页的测试计划。为此目的,我将用http://www.wikipedia.org网站。
有了足够理论知识,如今咱们将看到如何配置一个HTTP请求的测试计划。
在这一步中,配置测试计划可能会影响线程的行为,您能够添加可能使用到的外部类库。不过咱们不打算在这个例子中那样作。
在这一步,你须要建立一个负责执行全部测试组件的线程组,并配置主要属性:线程数,秒级的过渡时期,迭代次数。
在菜单中这样操做
Test Plan -> Add -> Thread ->ThreadGroup
你也能够指定错误状况下行为模式(继续,中止,中止当前线程……)
在这一步,给要测试HTTP请求添加采样器:
Add Sampler->HTTP Request
咱们须要为这种类请求设置不一样的属性:
在这个例子中,为要测试的服务器设置名称:www.wikipedia.org(不用指明HTTP或HTTPS协议)。若是须要的话,你应该修改端口,协议,执行方法等。在咱们的案例中这是没必要要的。这有几个关于配置代理,超时和不一样的头信息的参数,但在咱们的例子中,使用默认值。
为了后续可以看到结果,这是有必要的;就如咱们以前在本教程中看到那样,对于咱们的http请求的测试计划,有几种可选配置,咱们使用结果树:
Add Listener -> View Results Tree
在咱们的示例中,咱们没有改变任何东西,保留全部配置属性的默认值。
File->Save(或单击“Control + s”)
Run->Start(或单击“play”)
咱们能够看到,全部的请求已经完成,如预期那样,他们都提供有意义的响应,如此看来,咱们测试的网页工做正常(若是这是咱们的预期行为)。咱们能够玩的转这些结果,检查全部返回的数据。
咱们已经配置了一个测试计划,它发送大量请求到指定的服务器并解析响应。接下来咱们将看到如何使用其余类型的测试组件,如定时器和断言。
为了增长一个定时器,咱们只要右击测试计划并添加一个定时器:
Add Timer->Constant Timer
咱们配置500毫秒。每个请求都将在上一个请求执行完成后等待500毫秒。
在测试计划中,单击右键并添加一个断言持续时间,若是响应时间超过100毫秒,配置错误断言。针对the main sample only选项的配置以下:
Add assertion->Duration assertion
Add assertion->Size Assertion
咱们需确保响应信息的尺寸大于5000字节:
若是咱们运行测试计划,咱们将会看到响应信息老是大于设定的值,若是响应信息尺寸小于设定值,断言也会失败。
咱们将看到如何配置,运行一个针对MySQL数据库的测试,并对结果进行分析。这个例子是关于MySQL的,也可使用任何其余类型的数据库如Oracle,MongoDB或别的。
若是你没有在你的电脑安装MySQL,你能够从http://dev.mysql.com/downloads/ 下载安装MySQL服务器,这是很容易的。
下载MySQL链接器(mysql-connector-java-5.1.6),将它复制到JMeter安装目录下的lib目录下,本例中是C:\jmeter\apache-jmeter-2.11\lib
启动数据库服务器,你能够对它进行查询。
你能够建立一个你想要的数据库,咱们这里只是一个很是简单的例子:
1
2
3
4
5
6
7
8
9
10
11
|
createdatabasejmeter;
use jmeter;
createtablejmeter_stuff(idint,namevarchar(50), descriptionvarchar(50));
insertintojmeter_stuff(id,name, description)VALUES(1,"dani","the boss");
insertintojmeter_stuff(id,name, description)VALUES(2,"topo","the worker");
insertintojmeter_stuff(id,name, description)VALUES(3,"tupac","the other");
|
跟上一章节同样,进行以下操做建立测试计划:一个新的线程组,一个JDBC类型的配置元素和一个新的JDBC类型请求,以一样的方式添加一个监听器来解析和查看结果。
惟一的区别是采样器的类型,在这种状况下使用JDBC采样器。
1 | select*fromjmeter_stuff; |
添加一个新的JDBC链接配置到采样器:
点击右键 JDBC采样器->添加链接配置
改变参数以下:
1
2
3
4
5
|
Variable BoundtoPool= samenameasinthe sampler
DatabaseURl=jdbc:mysql://localhost:3306/jmeter
JDBC Driver.mysql.jdbc.Driver
username=
password=
|
设置用户名密码
您能够以相似在HTTP请求的测试计划相同的方式验证和检查输出结果。只要你须要,你也能够添加前置处理器,后置处理器,断言或其余任何一种元素。
在这种状况下,输出的是SELECT语句的结果。
你能够用这种取样器用于更新数据,以及修改采样器配置的SQL语句。
在下面的屏幕捕获的是请求响应结果的基本信息:
在这一章中,咱们将解释如何结合JUnit使用JMeter。从负载和性能的角度来看,JMeter为执行功能测试,提供了很是强大的机制。
首先,须要建立一个像下面的JUnit测试:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
publicclassJMeterTest
{
publicJMeterTest()
{
// just for testing purposes
System.out.println("calling the constructor");
}
@Before
publicvoidsetUp()throwsException
{
// just for testing purposes
System.out.println("calling setup");
}
@After
publicvoidtearDown()throwsException
{
// just for testing purposes
System.out.println("calling tearDown");
}
@Test
publicvoidtestMe()
{
for(inti =0; i <30; i++ )
{
// just asserting randomly in order to check what happens in each case
intrandomNumber = (int)( Math.random() *100);
System.out.println( randomNumber );
assertEquals(0, randomNumber %2);
}
}
}
|
1 |
为了查看JMeter如何使用他们,本试验主要包含两个断言,固然这本教程的目的不是详细解释单元测试或JUnit测试。
将单元测试打成一个JAR包,把它复制到JMeter的安装目录下的/lib/JUnit下。确保JAR文件包含你想让JMeter执行的测试类的.class文件。在文章的最后,你能够找到一个带有pom.xml文件的Java项目,你能够直接使用他去生成的JAR文件。如今你只须要编译代码:
1 | mvn compile |
或者直接在Eclipse或你喜欢的其余IDE中导出你的项目,生成包括字节码JAR文件。
入前所述,建立一个测试计划,添加一个JUnit类型采样器:Add Sampler->Junit Request ,配置并执行你想要测试的方法。
在咱们的例子中,咱们将运行基于JUnit 4的方法,但你也能够勾选框使用JUnit 3。
在这里,能够看到咱们刚刚建立的JUnit测试结果:
如上述截图所示,咱们全部的测试(一个测试,10次循环)都失败了。这是预期的行为,由于咱们但愿咱们的测试失败。其实咱们只是写了个单元测试,没有功能上的意义,是无用的。它的目的是要说明如何配置JMeter去执行这些类的单元测试。
在这一章所解释的内容 有助于你使用JMeter提供的便利性的功能进行应用程序的功能测试和业务逻辑的测试.它也颇有趣,由于它能够将Java语言的全部优点与JMeter的多线程能力相结合。
如今咱们将说明如何配置JMeter记录HTTP请求。为此咱们须要Firefox安装在咱们的机器,我是用版本32。
进入Firefox网络设置,选择手动代理选项和设置为本地主机服务器和端口8080(实际上,这加深了对你的JMeter配置)。以后选中“为全部协议使用代理服务器”。
咱们添加了一个新的线程组,给它起名。配置线程组线程数量为50,过渡时期为10秒,循环次数等于1。
在刚刚建立的线程组中添加一个新的配置元素,选择“HTTP Request Defaults”。
在这里你应该填写你想测试服务器名称。
如今咱们添加一个记录控制器到工做台。
选择工做台,不是测试计划,并添加一个非测试元件的”Test Script Recorder”。
你如今应该让工做台保存起来,而且与你的测试计划无关。保存测试计划不意味着保存了工做台。
配置记录以下:
若是你想为你的记录器添加一个定时器(常量类型),那么该定时器将由每一个被记录的HTTP请求所使用。
经过点击记录器启动按钮,你将启动JMeter代理服务器。
若是你为了生成一个HTTP请求而访问一个网页,例如使用Firefox(配置为在本章的第一步解释以后)访问http://www.oviedin.com,那么你会看到不一样的请求入口出如今你的测试计划记录控制器中。
这些记录其实是以前访问的web页面的HTTP请求。那些包含在过滤器配置测试脚本配置过的记录将被保存。能够在你的后续测试计划中从新配置使用。
不一样的插件应用的场景和用户不一样,其中的一些须要安装,有些不须要安装。
一些很是有用的插件,它们经过一些高级选项来解析结果,并利用图表分析结果 例如http://jmeter-plugins.org/wiki/GraphsGeneratorListener/。
也有一些可用插件,可以将JMeter与你的持续集成工具链接,直接从CI软件运行JMeter,执行测试计划,例如”https://wiki.jenkins-ci.org/display/JENKINS/Performance+Plugin“。
正如我所说的,随着插件数量的上升,不可能列出全部的插件。因此你在实现本身的插件功能时,尽量的去互联网上查找一下是否有可用的插件,这对本身是很是有价值的。
你也能够建立你本身的JMeter插件,但这超出了本文的范围。
在文章末尾,咱们要写下两个颇有用的技巧和最佳实践:
你能够经过命令行:
1 | jmeter -n -t test.jmx -l test.jtl. |