本篇文章主要讲解jmeter如何测试java请求,以项目中某个接口为例,请求数据为post,返回也为post
1:新建maven工程,pom文件为
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 3 <modelVersion>4.0.0</modelVersion> 4 <groupId>com.ustcinfo.jmeter</groupId> 5 <artifactId>java-post</artifactId> 6 <version>0.0.1-SNAPSHOT</version> 7 <name>HttpRequestPost</name> 8 <dependencies> 9 <!-- httppost请求依赖jar包 --> 10 <dependency> 11 <groupId>commons-io</groupId> 12 <artifactId>commons-io</artifactId> 13 <version>2.5</version> 14 </dependency> 15 <!-- java jmeter依赖jar包 --> 16 <dependency> 17 <groupId>org.apache.jmeter</groupId> 18 <artifactId>ApacheJMeter_core</artifactId> 19 <version>3.0</version> 20 </dependency> 21 <dependency> 22 <groupId>org.apache.jmeter</groupId> 23 <artifactId>ApacheJMeter_java</artifactId> 24 <version>3.0</version> 25 </dependency> 26 </dependencies> 27 28 <build> 29 <plugins> 30 <plugin> 31 <artifactId>maven-assembly-plugin</artifactId> 32 <configuration> 33 <descriptor>src/main/assembly/assembly.xml</descriptor> 34 </configuration> 35 <executions> 36 <execution> 37 <id>make-assembly</id> 38 <phase>package</phase> 39 <goals> 40 <goal>single</goal> 41 </goals> 42 </execution> 43 </executions> 44 </plugin> 45 </plugins> 46 </build> 47 </project>
2:新建JmeHttpRequestPost.java类
1 package com.ustcinfo.jmeter; 2 3 import java.io.DataOutputStream; 4 import java.io.InputStream; 5 import java.net.URL; 6 import java.net.URLConnection; 7 8 import org.apache.commons.io.IOUtils; 9 import org.apache.jmeter.config.Arguments; 10 import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient; 11 import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext; 12 import org.apache.jmeter.samplers.SampleResult; 13 14 public class JmeHttpRequestPost extends AbstractJavaSamplerClient { 15 16 private String number = "number"; 17 private String number_value = "18134536460"; 18 19 20 /* 21 * 参数化,number 22 */ 23 @Override 24 public Arguments getDefaultParameters() { 25 Arguments params = new Arguments(); 26 params.addArgument(number, number_value); 27 return params; 28 } 29 30 /* 31 * 运行方法 32 */ 33 public SampleResult runTest(JavaSamplerContext arg0) { 34 SampleResult sr = new SampleResult(); 35 try { 36 /*参数获取*/ 37 String number = arg0.getParameter("number"); 38 sr.sampleStart(); 39 /*请求地址*/ 40 String URL = "http://ip:port/WSSPort/"; 41 /*请求报文*/ 42 String Json = ""; 43 Json="{" 44 +"\"TcpCont\":{" 45 +"\"ServiceCode\":\"/ServiceBus/custView/cust/cust001\"," 46 +"\"SrcSysID\":\"100000\"," 47 +"\"TransactionID\":\"3b236e76-4662-4df6-8c61-46a8e3d2df56\"," 48 +"\"MsgId\":\"\"" 49 +"}," 50 +"\"SvcCont\":{" 51 +"\"SOO\":[" 52 +"{" 53 +"\"PUB_REQ\":{" 54 +"\"PAGE_INDEX\":\"1\"," 55 +"\"PAGE_SIZE\":\"5\"," 56 +"\"SVC_CONT_VER\":\"1.0\"," 57 +"\"TYPE\":\"QRY_CUST_INFO\"" 58 +"}," 59 +"\"RETURN_OBJECTS\":{" 60 +"\"ACCOUNT\":{" 61 +"\"FIELDS\":\"\"" 62 +"}," 63 +"\"CONTACT\":{" 64 +"\"FIELDS\":\"\"" 65 +"}," 66 +"\"CUST\":{" 67 +"\"FIELDS\":\"\"" 68 +"}," 69 +"\"CUST_BRAND_LABEL\":{" 70 +"\"FIELDS\":\"\"" 71 +"}," 72 +"\"CUST_POINT\":{" 73 +"\"FIELDS\":\"\"" 74 +"}," 75 +"\"MANAGER\":{" 76 +"\"FIELDS\":\"CHANNEL_MEMBER_ID,MEMBER_NBR,CHANNEL_MEMBER_NAME,PHONE\"" 77 +"}," 78 +"\"PARTY_CENTIFICATION\":{" 79 +"\"FIELDS\":\"\"" 80 +"}," 81 +"\"TB_PTY_CERTIF_ID_VAR_INFO\":{" 82 +"\"FIELDS\":\"\"" 83 +"}," 84 +"\"CUST_SPEC_INFO\":{" 85 +"\"FIELDS\":\"\"" 86 +"}" 87 +"}," 88 +"\"CUST_REQ\":{" 89 +"\"CUST_ID\":\":getCustId("+number+",‘4‘,‘‘,551)\"," 90 +"\"LATN_ID\":\"551\"," 91 +"\"PASSWORD\":\"\"" 92 +"}" 93 +"}" 94 +"]" 95 +"}" 96 +"}"; 97 /*调用post请求方法*/ 98 String postResult = doHttpPost(Json, URL); 99 /*设置响应报文内容*/ 100 sr.setResponseData(postResult, null); 101 sr.setDataType(SampleResult.TEXT); 102 sr.setSuccessful(true); 103 sr.sampleEnd(); 104 } catch (Exception e) { 105 e.printStackTrace(); 106 } 107 108 return sr; 109 } 110 111 /** 112 * doHttpPost:http发送json报文形式的post请求 113 * @param xmlInfo 请求报文 114 * @param URL 请求地址 115 * @return String 响应内容 116 * @exception 117 */ 118 public static String doHttpPost(String xmlInfo, String URL) { 119 byte[] xmlData = xmlInfo.getBytes(); 120 InputStream instr = null; 121 try { 122 URL url = new URL(URL); 123 URLConnection urlCon = url.openConnection(); 124 urlCon.setDoOutput(true); 125 urlCon.setDoInput(true); 126 urlCon.setUseCaches(false); 127 urlCon.setRequestProperty("Content-Type", "text/xml"); 128 urlCon.setRequestProperty("Content-length", String.valueOf(xmlData.length)); 129 DataOutputStream printout = new DataOutputStream(urlCon.getOutputStream()); 130 printout.write(xmlData); 131 printout.flush(); 132 printout.close(); 133 instr = urlCon.getInputStream(); 134 byte[] bis = IOUtils.toByteArray(instr); 135 String ResponseString = new String(bis, "UTF-8"); 136 if ((ResponseString == null) || ("".equals(ResponseString.trim()))) { 137 System.out.println("返回空"); 138 } 139 return ResponseString; 140 141 } catch (Exception e) { 142 e.printStackTrace(); 143 return "0"; 144 } finally { 145 try { 146 instr.close(); 147 } catch (Exception ex) { 148 return "0"; 149 } 150 } 151 } 152 } 153
3:在maven工程src/main下面新建assembly.xml文件,用作maven打包
1 <assembly> 2 <id>assembly</id> 3 <formats> 4 <format>tar.gz</format> 5 </formats> 6 <includeBaseDirectory>true</includeBaseDirectory> 7 <fileSets> 8 <fileSet> 9 <directory>${project.build.directory}/dubbo/META-INF/assembly/bin</directory> 10 <outputDirectory>bin</outputDirectory> 11 <fileMode>0755</fileMode> 12 </fileSet> 13 <fileSet> 14 <directory>src/main/assembly/conf</directory> 15 <outputDirectory>conf</outputDirectory> 16 <fileMode>0644</fileMode> 17 </fileSet> 18 </fileSets> 19 <dependencySets> 20 <dependencySet> 21 <outputDirectory>lib</outputDirectory> 22 </dependencySet> 23 </dependencySets> 24 </assembly>
4:打包该工程,maven install,打包完成后可以看到target下生成了两个文件一个java-post-0.0.1-SNAPSHOT-assembly.tar还有一个java-post-0.0.1-SNAPSHOT.jar
将java-post-0.0.1-SNAPSHOT-assembly.tar中的lib文件夹下所有的jar包拷贝到jmeter的lib目录下,如果有重复的,则不替换用jmeter原生的jar包
将java-post-0.0.1-SNAPSHOT.jar拷贝到jmeter的lib/ext目录下
5:启动jmeter,验证该jar功能是否正常,新建一个java请求,如果有参数化可设置参数化文件
上图为两个线程测试了一下,发现调用通过成功,响应数据正常返回,故该脚本可以正常使用
至于如何用这个jmx脚本做性能测试,我就不在重复了,参考我的博文-jmeter命令行运行-单节点测试或者分布式测试
时间: 2024-12-16 11:47:27