- 翻译来自 Elements of a Test Plan
- 名词解释
Test Plan:测试计划
Thread Group:线程组
Controller:控制器
Sampler:采样器
Logical Controllers:逻辑控制器
Listener:监听器
The ramp-up period:过渡时间
scheduler:调度器
3. 测试计划中的重要组件
这一部分将介绍测试计划中的各个部分,一个最基本的测试计划中包括一个线程组,一个或多个采样器。
3.0 测试计划
测试计划里有一个叫做Functional Testing的复选框,勾选的话,JMeter将会记录每个样本从服务器返回的数据,并通过配置监听器写入指定文件中。如果是做压力测试,文件数据量过大会影响JMeter的性能, 因此这个按钮默认是关闭的。
如果没有选择写入的文件,这个按钮就是无效的;同时我们可以通过监听器上的* Configuration*按钮来保留指定字段。
3.1 线程组
线程组是测试的起点,所有的控制器、采样器必须包含在线程组中,但有些元素无需包含在线程组中,比如监听器,可以直接放在测试计划里,适用于整个线程组。线程组允许我们自行定义测试里的:
- 线程数量
- 过渡时间
- 执行测试的次数
线程组中的每个线程将独立执行完整的测试计划,多个线程用于模拟并发测试。
过渡时间是指JMeter花费多长时间启动所有的线程,比如共有10个线程,过渡时间为100秒,则每个线程启动后10下一个线程再启动。
过渡时间需要足够长以防测试刚开始工作负荷过大,有的时间也需要过渡时间短一点,保证第一批线程测试任务完成前最后一个线程启动完成。
开始的过渡时间等于线程数量,之后根据需要调整上下调整。
默认情况下线程组配置成循环执行(loop)所有组件一次。
线程组中包括一个调度器。点击线程组面板底部的复选框按钮可以禁用或启用额外的字段,包括测试时间、启动延迟、测试开始时间和结束时间
3.2 控制器
JMeter有两个类型的控制器,采样器和逻辑控制器。采样器告诉JMeter发送请求到服务器。例如,如果JMeter发送一个HTTP请求,则可以添加一个HTTP请求取样器。此外,还可以定制一个请求通过添加一个或多个取样器。有关更多信息,请参见 Samplers。逻辑控制器可以自定义逻辑来决定何时发送请求。例如,我们可以添加一个交错逻辑控制器交替采样两个HTTP请求。有关更多信息,请参见Logical Controllers。
3.2.1 采样器
采样器告诉JMeter向服务器发送请求并等待响应。取样器按照设置的顺序包含在元素Hash Tree中。控制器可以用来修改的取样器重复的数量。
JMeter取样器包括:
- FTP请求
- HTTP请求
- JDBC请求
- Java请求
- JMS请求
- JUnit测试请求
- LDAP请求
- 邮件请求
- 操作系统进程请求
- TCP请求
每个采样器有几个属性可以设置,并且可以通过添加一个或多个配置元素到测试计划进一步定制一个取样器。
如果要发送多个相同类型的请求(例如HTTP请求)到同一台服务器上,可以考虑使用一个默认的配置元素。每个控制器都有一个或多个默认元素(见下文)。
可以将一个监听器添加到测试计划中来查看请求或者将结果存储到磁盘上。
如果想验证请求的响应,可以添加一个断言采样器。例如,在压力测试一个web应用程序,服务器会返回一个成功的HTTP响应代码,但是页面可能有错误或缺失的部分,那么可以添加断言检查特定的HTML标记,常见的错误字符串等等。JMeter允许我们通过正则表达式创建断言规则。
JMeter's built-in samplers
3.2.2 逻辑采样器
逻辑控制器允许我们自定义逻辑来决定何时发送请求。逻辑控制器可以改变子元素发送请求的顺序,也可以修改请求,使JMeter重复请求等等。
通过一个测试的HashTree更好地理解逻辑控制器在测试计划中的影响:
- Test Plan
- Thread Group
- Once Only Controller
- Login Request (an HTTP Request)
- Load Search Page (HTTP Sampler)
- Interleave Controller
- Search "A" (HTTP Sampler)
- Search "B" (HTTP Sampler)
- HTTP default request (Configuration Element)
- HTTP default request (Configuration Element)
- Cookie Manager (Configuration Element)
- Once Only Controller
- Thread Group
这个测试中的登录请求将只执行一次,后续的迭代将跳过它,这是由 Once Only Controller控制的。
登录之后,下一个采样器加载搜索页面(想象一个web应用程序,用户登录时,然后去一个搜索页面做一个搜索)。这只是一个简单的请求,并没有透过任何逻辑控制器。
加载搜索页面后,我们要做一个搜索。实际上,我们想做两种不同的搜索,并且每次搜索我们想重新加载搜索页面。我们可以通过4个简单的HTTP请求元素(加载搜索,搜索“A”,加载搜索,搜索“B”)完成这个需求。但是,我们也可以使用交替控制器Interleave Controller每次通过测试传递一个子请求,并且保证了子请求的顺序。
注意HTTP Request Defaults属于交错控制器。由于“搜索A”和“搜索B”共享了许多相同的路径信息(HTTP请求规范包含域、端口、方法、协议、路径和参数,再加上其他可选项),并且到达相同的后端搜索引擎,因此我们并不是将两个具有相同配置的HTTP取样器配置在两个搜索引擎的路径字段,而是将共同的路径字段信息抽样出来,放到一个单独的配置元素HTTP Request Defaults中。当交错控制器从“搜索A”或“搜索B”中传递请求时,HTTP Request Defaults将填补空白的路径信息。所以,上面的测试计划里我们让这些请求的路径字段为空,并把这些路径字段放到配置元素中。
接下来一个元素是另一个HTTP Request Defaults,并且直接添加到线程组本身。线程组有一个内置的逻辑控制器,因此,这里的HTTP Request Defaults使用方式完全如上所述,填补了请求的空白。在web测试中将所有的HTTP采样器的DOMAIN字段留空,然后把这些信息放到HTTP Request Defaults,添加到线程组中。这样做的好处在于在不同的服务器测试应用程序只需改变HTTP Request Defaults的配置,而无需修改每一个采样器。
最后一个元素是[HTTP Cookie Manager]
(https://jmeter.apache.org/usermanual/component_reference.html#HTTP_Cookie_Manager),通常情况下所有的web测试都应该添加该元素,否则JMeter将忽略Cookie。通过添加HTTP Cookie Manager在线程组的级别,确保所有HTTP请求将共享相同的Cookie。
逻辑控制器可以组合实现不同的结果,详细查看built-in Logic Controllers。
3.2.3 Test Fragments
略
3.3 监听器
监听器主要用于收集JMeter运行时测试用例的相关信息。比如图形结果监听器(The Graph Results listener)在图形上绘制响应时间,查看结果树侦听器(The View Results Tree Listener)显示采样器请求和响应的详细信息,并且可以用基本的HTML和XML展示响应信息。其他侦听器提供摘要或聚合信息。
另外,监听器可以将数据保存到文件以供以后使用。存储的文件通过监听器的一个字段来保存, 此外,监听器中还有一个配置按钮,可以用来选择要保存哪些字段,以及使用csv还是xml格式。
注意,所有监听器保存的数据都是相同的,只不过展示数据的方式不同。
监听器可以添加到测试计划的任何位置,但只能从与它同一级或低一级的元素中采集数据。
3.4 定时器
默认情况下, JMeter的线程将按顺序不停歇的执行采样器,但我们可以在线程组中添加一个定时器来设置延时,因为如果不设置定时器,JMeter有可能在很短时间内发出很多请求导致服务器崩溃。
定时器的作用就是在每个采样器执行之前延迟一定的时间。
如果在一个线程组中添加了多个定时器,则JMeter会统计这些定时器的时间总和,并且在其作用的采样器之前停留统计的时间。当然定时器可以直接添加到采样器或控制器的子项中。
要在测试计划的单个位置设置一个延迟,可以通过采样器Flow Control Action。
3.5 断言
断言允许你断言关于从测试服务器收到的响应的行为。使用断言,可以“测试”应用程序是否返回期望的结果。
例如,我们可以断言一个查询的响应是否包含一些特定的文本,这个文本可以是一个perl风格的正则表达式。
可以任何采样器添加断言。例如,我们可以给一个HTTP请求采样器添加一个断言,检查响应是否包含文本“< / HTML >”,如果无法找到改文本,表示这个请求失败了。
注意,一个断言是作为一个采样器的子元素,因此其范围是一整个采样器。
添加断言监听器到线程组中来查看断言结果。失败的断言也将出现在树视图和表监听器中,并将计入到聚合和总结报告的错误率中。