jmeter之GUI运行原理
<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="2.7" jmeter="2.12 r1636949">
<hashTree>
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true">
<stringProp name="TestPlan.comments"></stringProp>
<boolProp name="TestPlan.functional_mode">false</boolProp>
<boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
<elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="TestPlan.user_define_classpath"></stringProp>
</TestPlan>
<hashTree>
</hashTree>
</hashTree>
</jmeterTestPlan>
XML Schema,使得我们如果我们真的要完全进行配置文件的操作的话会很有难度,不过我猜也没有人会这么做,因为这也太无聊了。
<hashTree>
<JavaSampler guiclass="JavaTestSamplerGui" testclass="JavaSampler" testname="Java请求" enabled="true">
<elementProp name="arguments" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="Sleep_Time" elementType="Argument">
<stringProp name="Argument.name">Sleep_Time</stringProp>
<stringProp name="Argument.value">100</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="Sleep_Mask" elementType="Argument">
<stringProp name="Argument.name">Sleep_Mask</stringProp>
<stringProp name="Argument.value">0xFF</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="Label" elementType="Argument">
<stringProp name="Argument.name">Label</stringProp>
<stringProp name="Argument.value"></stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="ResponseCode" elementType="Argument">
<stringProp name="Argument.name">ResponseCode</stringProp>
<stringProp name="Argument.value"></stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="ResponseMessage" elementType="Argument">
<stringProp name="Argument.name">ResponseMessage</stringProp>
<stringProp name="Argument.value"></stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="Status" elementType="Argument">
<stringProp name="Argument.name">Status</stringProp>
<stringProp name="Argument.value">OK</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="SamplerData" elementType="Argument">
<stringProp name="Argument.name">SamplerData</stringProp>
<stringProp name="Argument.value"></stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="ResultData" elementType="Argument">
<stringProp name="Argument.name">ResultData</stringProp>
<stringProp name="Argument.value"></stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
</collectionProp>
</elementProp>
<stringProp name="classname">org.apache.jmeter.protocol.java.test.JavaTest</stringProp>
</JavaSampler>
<hashTree/>

<elementProp name="Sleep_Time" elementType="Argument">
<stringProp name="Argument.name">Sleep_Time</stringProp>
<stringProp name="Argument.value">100</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
/**这个包名,也是这个文件所在的路径,java自带的一个演示文件,
英文好的同学可自行阅读,英文不好的可以和我一起阅读,
互相学习,共同进步,如有错误欢迎指正。
*/
package org.apache.jmeter.protocol.java.test; import java.io.Serializable;
import java.util.Iterator;
import java.util.concurrent.TimeUnit; import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.testelement.TestElement;
import org.apache.jorphan.logging.LoggingManager;
import org.apache.log.Logger; public class JavaTest extends AbstractJavaSamplerClient implements Serializable { private static final Logger LOG = LoggingManager.getLoggerForClass(); private static final long serialVersionUID = 240L; /**这个变量是用来记录JavaSamplerContext对象context调用getLongParameter方法传递DEFAULT_SLEEP_TIME和SLEEP_NAME运算后的返回值*/
private long sleepTime; /** 下边这个变量的值100就是Sleep_Time的默认值,也是我们在页面中看到的那个100,注意这个值是一个毫秒值. */
public static final long DEFAULT_SLEEP_TIME = 100; /** 这个变量就是用来存储GUI中的那个Sleep_Time的变量。 */
private static final String SLEEP_NAME = "Sleep_Time"; /**
以下的变量名称和GUI中的变量名称都是相同的,不难看懂。
*/
private long sleepMask; public static final long DEFAULT_SLEEP_MASK = 0xff; private static final String DEFAULT_MASK_STRING = "0x" + (Long.toHexString(DEFAULT_SLEEP_MASK)).toUpperCase(java.util.Locale.ENGLISH); private static final String MASK_NAME = "Sleep_Mask"; private String label; private static final String LABEL_NAME = "Label"; private String responseMessage; private static final String RESPONSE_MESSAGE_DEFAULT = ""; private static final String RESPONSE_MESSAGE_NAME = "ResponseMessage"; private String responseCode; private static final String RESPONSE_CODE_DEFAULT = ""; private static final String RESPONSE_CODE_NAME = "ResponseCode"; private String samplerData; private static final String SAMPLER_DATA_DEFAULT = ""; private static final String SAMPLER_DATA_NAME = "SamplerData"; private String resultData; private static final String RESULT_DATA_DEFAULT = ""; private static final String RESULT_DATA_NAME = "ResultData"; private boolean success; private static final String SUCCESS_DEFAULT = "OK"; private static final String SUCCESS_NAME = "Status"; /**
* 默认的构造函数,实例化了一个客户端的类
*/
public JavaTest() {
LOG.debug(whoAmI() + "\tConstruct");
} /*
* 这个方法就是设置了所有的值,我们从GUI中输入的值就是由这个方法进行读取并且赋值给上边定义的变量。
*/
private void setupValues(JavaSamplerContext context) { sleepTime = context.getLongParameter(SLEEP_NAME, DEFAULT_SLEEP_TIME);
sleepMask = context.getLongParameter(MASK_NAME, DEFAULT_SLEEP_MASK); responseMessage = context.getParameter(RESPONSE_MESSAGE_NAME, RESPONSE_MESSAGE_DEFAULT); responseCode = context.getParameter(RESPONSE_CODE_NAME, RESPONSE_CODE_DEFAULT); success = context.getParameter(SUCCESS_NAME, SUCCESS_DEFAULT).equalsIgnoreCase("OK"); label = context.getParameter(LABEL_NAME, "");
if (label.length() == 0) {
label = context.getParameter(TestElement.NAME);
} samplerData = context.getParameter(SAMPLER_DATA_NAME, SAMPLER_DATA_DEFAULT); resultData = context.getParameter(RESULT_DATA_NAME, RESULT_DATA_DEFAULT);
} /**
这是一个初始化方法,可以理解为loadrunner中的init
*/
@Override
public void setupTest(JavaSamplerContext context) {
if (LOG.isDebugEnabled()) {
LOG.debug(whoAmI() + "\tsetupTest()");
listParameters(context);
}
} /**
这个方法是一个与生命周期相关的方法
决定了哪些变量参数是否显示到GUI页面上。这个方法类一加载就会运行,运行的顺序排在所有复写的方法中第一。
*/
@Override
public Arguments getDefaultParameters() {
Arguments params = new Arguments();
params.addArgument(SLEEP_NAME, String.valueOf(DEFAULT_SLEEP_TIME));
params.addArgument(MASK_NAME, DEFAULT_MASK_STRING);
params.addArgument(LABEL_NAME, "");
params.addArgument(RESPONSE_CODE_NAME, RESPONSE_CODE_DEFAULT);
params.addArgument(RESPONSE_MESSAGE_NAME, RESPONSE_MESSAGE_DEFAULT);
params.addArgument(SUCCESS_NAME, SUCCESS_DEFAULT);
params.addArgument(SAMPLER_DATA_NAME, SAMPLER_DATA_DEFAULT);
params.addArgument(RESULT_DATA_NAME, SAMPLER_DATA_DEFAULT);
return params;
} /**
主要运行的代码,相当于Loadrunner中的action
*/
@Override
public SampleResult runTest(JavaSamplerContext context) {
setupValues(context); SampleResult results = new SampleResult(); results.setResponseCode(responseCode);
results.setResponseMessage(responseMessage);
results.setSampleLabel(label); if (samplerData != null && samplerData.length() > 0) {
results.setSamplerData(samplerData);
} if (resultData != null && resultData.length() > 0) {
results.setResponseData(resultData, null);
results.setDataType(SampleResult.TEXT);
} //这个方法很重要,是标记一个事务的开始,可以理解为loadrunner中的lr_start_transaction
results.sampleStart(); long sleep = sleepTime;
if (sleepTime > 0 && sleepMask > 0) {
long start = System.currentTimeMillis(); sleep = sleepTime + (start % sleepMask);
} try { if (sleep > 0) {
TimeUnit.MILLISECONDS.sleep(sleep);
}
results.setSuccessful(success);
} catch (InterruptedException e) {
LOG.warn("JavaTest: interrupted.");
results.setSuccessful(true);
} catch (Exception e) {
LOG.error("JavaTest: error during sample", e);
results.setSuccessful(false);
} finally {
// 这里就是标记事务的结束,相当于loadrunner中的lr_end_transaction
results.sampleEnd();
} if (LOG.isDebugEnabled()) {
LOG.debug(whoAmI() + "\trunTest()" + "\tTime:\t" + results.getTime());
listParameters(context);
} return results;
} /**
包含初始化参数的一个调试方法。
*/
private void listParameters(JavaSamplerContext context) {
Iterator<String> argsIt = context.getParameterNamesIterator();
while (argsIt.hasNext()) {
String name = argsIt.next();
LOG.debug(name + "=" + context.getParameter(name));
}
} /**
这个就是一个用户自定义的调试方法。
*/
private String whoAmI() {
StringBuilder sb = new StringBuilder();
sb.append(Thread.currentThread().toString());
sb.append("@");
sb.append(Integer.toHexString(hashCode()));
return sb.toString();
} } //还有一个常见方法,这里没有写出来,那就是 teardownTest,这个其实就可以理解为loadrunner中的end
至此,比较基本的东西都已说完,欢迎补充,共同学习。
更深层次的东西还需进一步阅读源代码,了解原理。
jmeter之GUI运行原理的更多相关文章
- 【转】Jmeter之GUI运行原理
一.一语道破jmeter 大家都知道我们在应用jmeter的图形化界面来进行操作,保存后生成的是一个.jmx文件. 那么这个.jmx文件中都是些什么呢. <?xml version=" ...
- Jmeter非GUI运行,生成html报告
一.JMete执行方式 JMeter执行方式有2种,一种是GUI模式,一种是非GUI模式.GUI模式就是界面模式,非GUI模式就是命令行模式.界面模式主要用来编写和调试脚本用的,项目的真正执行最好是采 ...
- JMeter实战(二) 运行原理
运行原理 如果不用工具,要做 100 并发的压力测试,得想办法组织 100 个人,每个人操作1台电脑,一声令下,100 个人同时点击,对系统造成 100 并发.现实中,很难找 100 个人和 100 ...
- Jmeter运行原理
Jmeter运行原理: JMETER是运行在JVM虚拟机上的,每个进程的开销比loadrunner的进程开销大,如果以进程的方式来运行每台负载机上的进程数量不会允许太多,当有大量并发时就需要大量的负载 ...
- jmeter的运行原理和测试计划要素
jmeter运行原理 1.jmeter运行在JVM虚拟机上,jmeter是以线程的方式运行的. 2.jmeter通过线程组来驱动多个线程,运行测试脚本对被测试服务器发起负载,每一个负载机上够可以运行多 ...
- JMeter非GUI方式运行时动态设置线程组及传参
http://blog.csdn.net/selingchen/article/details/48106517 在使用JMeter进行性能测试自动化时,可能会有如下需求: 1.指定运行多少线程,指定 ...
- Jmeter结构体系及运行原理
Jmeter结构体系 把Jmeter的结构体系拆分为三维空间,如图: X1~X5:是负载模拟的一个过程,使用这些组件来完成负载的模拟: X1:选择协议,模拟用户请求,检查服务器响应是否正确,然后收集结 ...
- JMeter非GUI界面运行
JMeter是一款可以用于做接口可以用于作压力性能的应用程序,该程序是纯Java语音开发,所有对环境支持都比较好. JMeter可以运行模式有两种,一种是UI图形,另一种是命令模式运行也就是非GUI模 ...
- 『动善时』JMeter基础 — 55、JMeter非GUI模式运行
目录 1.JMeter的非GUI模式说明 2.为什么使用非GUI模式运行JMeter 3.怎样使用非GUI模式运行JMeter (1)非GUI模式运行JMeter步骤 (2)其它参数说明 4.CLI模 ...
随机推荐
- 3D数学--学习笔记(五岁以下儿童):总结一些概念(避免遗忘!)
下面是一些概念只是一个简单的解释,这里是它的一个简单的了解! 当人们谈论,我能理解有关. 1.正交投影: 投影.这意味着降维操作. 全部的点都被拉平至垂直的轴(2D)或平面(3D)上.这样的类型的投影 ...
- shuffle一个简单的过程叙述性说明
shuffle它是在map和reduce过程之间.我们看看在这个过程中的步骤,了解在这个问题上不深,有可能是一个错误.忘记修正 1. map map出口key,value,里的context.writ ...
- javascript变量,作用域和内存问题(一)
js对象的引用是很有意思的,引用型对象是不可以直接引用的,我猜测这是原型的来源之一,有大神请详解或斧正. “引用类型的值是保存在内存中的对象.与其他语言不同,JavaScript不允 ...
- C++生产和使用的临时对象
所谓暂时对象就是一种无名对象. 它的出现假设不在程序猿的预期之下(比如不论什么pass by value操作都会引发copy操作,于是形成一个暂时对象),往往照成效率上的负担. 但有时候能够制造 ...
- 【2014 Multi-University Training Contest 2 1002】/【HDU 4873】 ZCC Loves Intersection
果然,或滥用零件,啥都不说了.我们欣慰地学习阅读.这两天残疾儿童是数学. 这是求所需的问题,不明确.贴上官方的解题报告. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi ...
- SQL入门学习1-查询基础
2-1 SELECT语句基础 SELECT语句作用 SELECT 语句用于从表中选取数据. 结果被存储在一个结果表中(称为结果集). 重点 使用SELECT语句从表中选取数据. 为列设定显示用的别名 ...
- extjs_09_定义自己的页面组件
1.项目截图 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWRhbV93enM=/font/5a6L5L2T/fontsize/400/fill/I0J ...
- 【代码优化】当许多构造函数的参数,请考虑使用builder模式
静态工厂和构造具有共同的局限性:我们不能扩展到大量的非常好的可选参数. 1.对于多个可选參数的构造器.我们都习惯採用重叠构造器模式.比方一个參数的构造器调用2个參数的构造器. 2个參数的构造器 ...
- uva 1556 - Disk Tree(特里)
题目连接:uva 1556 - Disk Tree 题目大意:给出N个文件夹关系,然后依照字典序输出整个文件文件夹. 解题思路:以每一个文件夹名作为字符建立一个字典树就可以,每一个节点的关系能够用ma ...
- ASP.NET农历时间显示(两)
在拍摄的月球时前(http://blog.csdn.net/yysyangyangyangshan/article/details/6802950),只是没有进行封装使用起来须要手动改动. 本次进行简 ...