jmeter之——java压测

8 篇文章 1 订阅

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

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

<!-- jmeter -->
	<dependency>
	    <groupId>org.apache.jmeter</groupId>
	    <artifactId>ApacheJMeter_core</artifactId>
	    <version>3.0</version>
	</dependency>
	<dependency>  
        <groupId>org.apache.jmeter</groupId>  
        <artifactId>ApacheJMeter_java</artifactId>  
        <version>3.0</version>  
    </dependency>

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、打包

<build>
  	<finalName>jmeterTest</finalName>
	<resources>
		<resource>
			<directory>src/main/resources</directory>
			<filtering>true</filtering><!--这里开启变量替换-->
			<includes>
				<include>**/*.xml</include>
				<include>**/*.properties</include>
				<include>**/*.json</include>
			</includes>
		</resource>
	</resources>
	<plugins>
			<plugin>
				<artifactId>maven-dependency-plugin</artifactId>
				<executions>
					<execution>
						<phase>package</phase>
						<goals>
							<goal>copy-dependencies</goal>
						</goals>
					</execution>
				</executions>
				<configuration>
					<outputDirectory>${project.build.directory}/lib</outputDirectory>
					<excludeTransitive>false</excludeTransitive>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-jar-plugin</artifactId>
				<version>2.5</version>
				<configuration>
					<archive>
						<manifest>
							<addClasspath>true</addClasspath>
							<mainClass>com.abc.jmeterTest.RpcTest</mainClass>
							<classpathPrefix>lib/</classpathPrefix>
							<useUniqueVersions>false</useUniqueVersions>
						</manifest>
					</archive>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-assembly-plugin</artifactId>
				<version>2.4</version>
				<configuration>
					<descriptors>
						<descriptor>assembly/assembly.xml</descriptor>
					</descriptors>
				</configuration>
				<executions>
					<execution>
						<id>make-assembly</id>
						<phase>package</phase>
						<goals>
							<goal>single</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
  </build>

assembly.xml
<assembly
	xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
	<id>pack</id>
	<!-- SNAPSHOT,Base,Alpha,Beta,RC,Release, LATEST -->
	<formats>
		<format>zip</format>
	</formats>
	<includeBaseDirectory>false</includeBaseDirectory>
	<dependencySets>
		<dependencySet>
			<useProjectArtifact>false</useProjectArtifact>
			<outputDirectory>lib</outputDirectory>
			<scope>runtime</scope>
			<outputFileNameMapping>${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}</outputFileNameMapping>
		</dependencySet>
	</dependencySets>
	<fileSets>
		<fileSet>
			<directory>target</directory>
			<outputDirectory>/</outputDirectory>
			<includes>
				<include>jmeterTest.jar</include>
			</includes>
		</fileSet>
		<fileSet>
			<directory>target/classes</directory>
			<outputDirectory>conf</outputDirectory>
			<includes>
				<include>*.properties</include>
				<include>*.xml</include>
			</includes>
		</fileSet>
	</fileSets>
</assembly>

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

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

3、压测:

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

2)压测:

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

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不向服务器发送数据请求,一般被用作调试目的使用。

参考:

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

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


 


 

在使用JMeter进行Java方法压测时,可以通过编写自定义的Java脚本来实现。你可以实现JavaSamplerClient接口或继承AbstractJavaSamplerClient类,并重写相应的方法。 首先,你需要将编写的Java脚本放置在JMeter的lib/ext目录下,并重新启动JMeter。然后,在JMeterJava Sample中使用你编写的脚本。 在编写脚本时,你需要确保JMeter的版本与你要进行压测Java方法的版本一致。你可以在pom.xml文件中添加以下依赖,来指定JMeter的版本: ```xml <dependency> <groupId>org.apache.jmeter</groupId> <artifactId>ApacheJMeter_core</artifactId> <version>3.0</version> </dependency> <dependency> <groupId>org.apache.jmeter</groupId> <artifactId>ApacheJMeter_java</artifactId> <version>3.0</version> </dependency> ``` 这样,就可以使用JMeter来进行Java方法压测了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [jmeter之——java压测](https://blog.csdn.net/liuxiao723846/article/details/52831023)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [jmeter压测RocketMQ的插件](https://download.csdn.net/download/weixin_40126600/85011909)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赶路人儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值