jmeter之——java压测

jmeter支持自定义java脚本的压测。编写java脚本,需要实现JavaSamplerClient接口或继承AbstractJavaSamplerClient,并重写。

pom.xml(jmeter的版本最好和压测用的一致)


	
	    org.apache.jmeter
	    ApacheJMeter_core
	    3.0
	
	  
        org.apache.jmeter  
        ApacheJMeter_java  
        3.0  
    

1、编写压测java脚本:

1)新建java工程,编写被压测代码的”客户端”:

假设本例需要压测查询mysql的效率(jmeter自带压测jdbc的功能),写一个压测mysql的代码

public class HelloTest {
	
	
	public String getMysql() {
		String res = "";
		String url = "jdbc:mysql://s1h.dbtest3.w.soft.db:8663/_test?"
                + "user=_test&password=123321&useUnicode=true&characterEncoding=UTF8";
		
		try {
			Class.forName("com.mysql.jdbc.Driver");// 动态加载mysql驱动
			Connection conn = DriverManager.getConnection(url);
			Statement stmt = conn.createStatement();
            String sql = "select name,brief from author where author_id=200040750";
            ResultSet rs = stmt.executeQuery(sql);
            while (rs.next()) {
                System.out
                        .println(res = rs.getString(1));// 入如果返回的是int类型可以用getInt()
            }
            rs.close();
            conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} 
		
		return res;
	}

	public static void main(String... strings) {
		HelloTest test = new HelloTest();
				
		test.getMysql();
	}
}

2)编写jmeter测试脚本,继承AbstractJavaSamplerClient:

public class AppTest extends AbstractJavaSamplerClient {

	// 把测试的一些默认数据在程序运行前显示到JMeter客户端
	@Override
	public Arguments getDefaultParameters() {
		Arguments params = new Arguments();
        params.addArgument("num1", "");
        params.addArgument("num2", "");
        return params;
	}

	// 子类用它来 记录log
	protected org.apache.log.Logger getLogger() {
		return null;
	}

	// 初始化方法,实际运行时每个线程仅执行一次,在测试方法运行前执行
	public void setupTest(JavaSamplerContext context) {
		// 获取界面中传递的值
		/*String value1 = context.getParameter("num1");
		String value2 = context.getParameter("num2");*/
	}

	// 测试执行的循环体,根据线程数和循环次数的不同可执行多次
	public SampleResult runTest(JavaSamplerContext context) {
        SampleResult sampleresult = new SampleResult();
		//获取界面中传递的值  
        String value1 = context.getParameter("num1");  
        String value2 = context.getParameter("num2");
        
        sampleresult.sampleStart();//计时开始
        //测试方法
        try {
        	//MqProductor.sendMessage("liuxiao:"+value1+","+value2);
        	HelloTest test = new HelloTest();
        	String sum = test.getMysql();
        	//将结果写入结果树:在jmeter的监听器-查看结果树时即可查看返回结果 
        	sampleresult.setResponseData( "结果是:"+sum+","+value1+","+value2 ,null);
        	sampleresult.setDataType(SampleResult. TEXT);
        	sampleresult.setSuccessful( true);
		} catch (Exception e) {
			sampleresult.setSuccessful( false);//不满足判断条件则判为false,会出现在监听器-聚合报告的Error%列
			e.printStackTrace();
		} finally {
			sampleresult.sampleEnd();  //计时结束
		}
        
        //判断测试成功与否的方法:可根据实际进行判断,此处为如果结果非空,则认为改次调用成功
        /*if (a.equals("a")) {
        	sampleresult.setSuccessful( true);
        	//将结果写入结果树:在jmeter的监听器-查看结果树时即可查看返回结果 
        	sampleresult.setResponseData( "结果是:"+a ,null);
        	sampleresult.setDataType(SampleResult. TEXT);
        } else {
        	sampleresult.setSuccessful( false);//不满足判断条件则判为false,会出现在监听器-聚合报告的Error%列
        }*/
        return sampleresult;
	}

	// 结束方法,实际运行时每个线程仅执行一次,在测试方法运行结束后执行
	public void teardownTest(JavaSamplerContext context) {
		// 获取界面中传递的值
		/*String value1 = context.getParameter("key1");
		String value2 = context.getParameter("key2");*/
	}
	
	// main只是为了调试用,最后打jar包的时候注释掉。
	public static void main(String[] args) { 
        Arguments params = new Arguments(); 
        params.addArgument("num1", "1");//设置参数,并赋予默认值1 
        params.addArgument("num2", "2");//设置参数,并赋予默认值2
        JavaSamplerContext arg0 = new JavaSamplerContext(params); 
        AppTest test = new AppTest(); 
        test.setupTest(arg0); 
        test.runTest(arg0);
        test.teardownTest(arg0); 
    }
}

运行main函数,查看输出是否正确。

2、打包


  	jmeterTest
	
		
			src/main/resources
			true
			
				**/*.xml
				**/*.properties
				**/*.json
			
		
	
	
			
				maven-dependency-plugin
				
					
						package
						
							copy-dependencies
						
					
				
				
					${project.build.directory}/lib
					false
				
			
			
				org.apache.maven.plugins
				maven-jar-plugin
				2.5
				
					
						
							true
							com.abc.jmeterTest.RpcTest
							lib/
							false
						
					
				
			
			
				org.apache.maven.plugins
				maven-assembly-plugin
				2.4
				
					
						assembly/assembly.xml
					
				
				
					
						make-assembly
						package
						
							single
						
					
				
			
		
  

assembly.xml

	pack
	
	
		zip
	
	false
	
		
			false
			lib
			runtime
			${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}
		
	
	
		
			target
			/
			
				jmeterTest.jar
			
		
		
			target/classes
			conf
			
				*.properties
				*.xml
			
		
	

1)使用maven,把项目打包成MyTest.jar和lib目录(依赖的各种jar)

2)将MyTest.jar和lib目录拷贝到jmeter的JMETER_HOME\lib\ext目录(因为jmeter运行时需要从ext目录加载需要的第三方类

3、压测:

1)打开jmeter,创建线程组、simple>java请求;

jmeter之——java压测_第1张图片

2)压测:

压测后,会在结果树中显示结果,并且在jmeter的黑屏控制台中把代码中的system.out信息输出。

jmeter之——java压测_第2张图片

4、补充:

1)JMeter Java Sampler介绍

Arguments

getDefaultParameters() 用于获取界面的参数

SampleResult

runTest(JavaSamplerContext context) 类似于LR的Action,result.sampleStart()一个事务开始,result.sampleEnd()一个事务 结束

void

setupTest(JavaSamplerContext context) 初始化方法,类似于LR的init和Junit中的setUp()

void

teardownTest(JavaSamplerContext context) 类似于LR的end和Junit中的tearDown()

执行的先后顺序为:
getDefaultParameters() --> setupTest(JavaSamplerContext context) --> runTest(JavaSamplerContext context) --> teardownTest(JavaSamplerContext context)
 
常用的方法:
①、addArgument("name", "value")    定义参数
②、sampleStart()    定义事务的开始,类似于LR的lr_start_transaction,和LR一样事务间不要放无关代码
③、sampleEnd()    定义事务的结束,类似于LR的lr_end_transaction
④、setSuccessful(true、false)    设置运行结果的成功或失败,Jmeter统计成功失败的次数,在聚合报告中能够体现。

 

2)自带Java Request Sampler:

JMeter默认实现了两个Java Request Sampler:SleepTest Sampler和JavaTest Sampler。
JavaTest Sampler不向服务器发送数据请求,一般被用作调试目的使用。

jmeter之——java压测_第3张图片

参考:

http://www.cnblogs.com/yangxia-test/p/4019541.html

http://blog.csdn.net/xieyuemin/article/details/51824407
 


 


 

你可能感兴趣的:(java,jmeter)