接口压测之——put方法2


由于LR不支持PUT方式,所以只好通过java Vuser写压测脚本,使用httpclient jar包,我使用的httpclient4.5版本。





/*
 * LoadRunner Java script. (Build: _build_number_)
 * 
 * Script Description: 
 *                     
 */

import lrapi.lr;
import lrapi.web; 


import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;


import java.util.Date;
import java.text.SimpleDateFormat;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;


public class Actions
{

	public int init() throws Throwable {	
		return 0;
	}//end of init

	public int action() throws Throwable {

		HttpClient client = HttpClients.createDefault();
		HttpPut put = new HttpPut("http://xxxxcart.beta1.fn/xxxCart/rest/v1/cart/");

	//	lr.save_string(lr.eval_string("<owner>"), "user"); 

	//      lr.output_message("The value of str = " + lr.eval_string("<user>") + "."); 

		String sourceStr = lr.eval_string("<name5529206105542>");
		String sourceArray[] = sourceStr.split(",");

		List<BasicNameValuePair> parameters = new ArrayList<BasicNameValuePair>();
		parameters.add(new BasicNameValuePair("owner",sourceArray[0]));

		lr.save_string(sourceArray[0], "user"); 

	//	parameters.add(new BasicNameValuePair("owner","name5529206105542"));

		for ( int i=2;i<sourceArray.length;i++ ) {
		    lr.save_string(sourceArray[i],"id1");
		//  lr.output_message("id1 value is "+lr.eval_string("<id1>"));

		    parameters.add(new BasicNameValuePair("area_seq","CS000016"));
		    parameters.add(new BasicNameValuePair("is_login","1"));
		    parameters.add(new BasicNameValuePair("mem_type","0"));
		//  parameters.add(new BasicNameValuePair("cart_detail_list","[{\"cart_detail_id\":\"715\",\"qty\":2,\"selected\":true,\"campaign_seq\":\"\"}]"));
		    parameters.add(new BasicNameValuePair("cart_detail_list","[{\"cart_detail_id\":\"<id1>\",\"qty\":<qty>,\"selected\":true,\"campaign_seq\":\"\"}]"));
		
/*		
		List<BasicNameValuePair> parameters = new ArrayList<BasicNameValuePair>();
		parameters.add(new BasicNameValuePair("owner","<user>"));		
		parameters.add(new BasicNameValuePair("area_seq","CS000016"));
		parameters.add(new BasicNameValuePair("is_login","1"));
		parameters.add(new BasicNameValuePair("mem_type","0"));
		parameters.add(new BasicNameValuePair("cart_detail_list","[{\"cart_detail_id\":\"<id>\",\"qty\":2,\"selected\":true,\"campaign_seq\":\"\"}]"));
*/

           //         System.out.println("parameters is " + parameters );

		    try {
			    put.setEntity(new UrlEncodedFormEntity(parameters,"UTF-8"));
    
			    lr.start_transaction("t1");
			    HttpResponse response = client.execute(put);			    			      
			    HttpEntity entity = response.getEntity();
    
			    String result = EntityUtils.toString(entity, "UTF-8");    
		//	    System.out.println(result);			    
			    boolean b = result.contains("\"code\":1");
		//	    System.out.println(b);
			    
			    if ( b == true ) {
			    //	System.out.println("为真");
				    lr.end_transaction("t1", lr.PASS);
			    } else {
		//		System.out.println("为假");
			    //	lr.end_transaction("t1", lr.FAIL);
				FileWriter writer = null;
				try {   
				    Date now = new Date(); 
				    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");//可以方便地修改日期格式 
				    				    
				    String hehe = dateFormat.format( now );

				    writer = new FileWriter("e://codeerror.txt", true); 
			       //   writer.write(result);
				    BufferedWriter buffer = new BufferedWriter(writer); 
				    buffer.write(hehe);
				    buffer.write(lr.eval_string("<user>"));
				    buffer.write(result);
				    
				    buffer.newLine();
				    buffer.flush();
				    
				    buffer.close();
				} catch (IOException e) {   
				    e.printStackTrace();   
				} finally {   
				    try {   
					    if(writer != null){
						    writer.close();   
					    }
				    } catch (IOException e) {   
					e.printStackTrace();   
				    }   
				} 				    
			    }
			    			    
		    } catch (UnsupportedEncodingException e) {    
			    e.printStackTrace();
		    } catch (ClientProtocolException e) {
			    // TODO Auto-generated catch block
			    e.printStackTrace();
		    } catch (IOException e) {
			    // TODO Auto-generated catch block
			    e.printStackTrace();
		    }
		}//end of for

		return 0;
	}//end of action


	public int end() throws Throwable {
		return 0;
	}//end of end
}























<think>好的,我现在需要帮助用户了解如何使用JMeter进行接口试的实际操作,包括示例。用户已经提供了一些相关的引用内容,我需要结合这些引用和我的知识来生成一个结构清晰的中文回答,并且按照用户的要求生成相关问题。首先,我需要整理用户提供的引用内容,看看哪些部分可以直接用上。 引用[1]提到JMeter是用于试和接口试的工具,具有开源、灵活等优势。引用[2]和[3]说明了JMeter可以模拟多用户并发,试性能和稳定性,并且能生成报告。引用[5]给出了一个试结论的例子,包括TPS峰值和响应时间分析,这些可以作为示例部分的内容。引用[4]提到MeterSphere兼容JMeter,可能可以作为扩展内容。 接下来,我需要按照用户的要求,分步骤讲解实际操作流程。用户需要实战教程和示例,所以应该包括创建试计划、配置元件、添加请求、断言、监听器,以及运行试和分析结果。每个步骤需要详细说明,并且结合示例,比如引用[5]中的保存XXXX接口的响应时间问题,可以作为一个例子说明如何分析结果。 同时,用户要求行内数学表达式使用$...$,比如在计算TPS时可能需要用到公式,例如计算预期TPS为$50 \times 13 / 60 \approx 10.83$次/秒,这样符合格式要求。另外,独立公式需要用$$...$$,但可能在试中公式较少,如果有的话需要注意。 还要注意引用标识,比如在提到试结论时,末尾加上[^5],在提到JMeter的优势时加上[^1][^3]。需要确保引用自然地插入到相关内容后面。 生成的相关问题需要基于回答内容,可能涉及试的步骤、性能分析方法、常见问题解决、结果解读以及与其他工具对比等。需要确保问题有针对性,能够帮助用户进一步学习。 现在需要组织回答结构: 1. 引言:介绍JMeter在接口试中的应用,引用[1][3]。 2. 环境准备:安装JMeter和Java。 3. 创建试计划:步骤和线程组配置。 4. 配置HTTP请求:示例接口和参数。 5. 添加断言和监听器:如何验证响应和收集数据。 6. 运行试和分析:引用[2][5]中的试结果和结论。 7. 示例分析:引用[5]的具体案例,说明响应时间问题。 8. 扩展建议:提到MeterSphere[^4]。 9. 注意事项:参数化、分布式试等。 在写作过程中,需要确保每个步骤清晰,结合示例,正确使用引用,并且语言流畅。同时检查LaTeX语法是否正确,比如变量和公式是否正确使用$符号,是否有独立公式需要单独成段。最后生成相关问题,覆盖教程中的关键点,如步骤、优化、结果分析、工具对比等。</think>### JMeter接口试实战教程 #### **1. 环境准备** - 安装Java环境(JMeter基于Java开发) - 下载并解[JMeter](https://jmeter.apache.org/) - 启动JMeter:执行`bin/jmeter.bat`(Windows)或`bin/jmeter.sh`(Linux/Mac) #### **2. 创建试计划** 1. **新建试计划** 右键“Test Plan” → Add → Threads (Users) → **Thread Group**,设置并发参数: - **Number of Threads (users)**: 并发用户数(如50) - **Ramp-Up Period (seconds)**: 用户启动时间(如10秒内逐步加) - **Loop Count**: 循环次数(如永久循环,通过调度器控制时长) 2. **配置HTTP请求** 右键Thread Group → Add → Sampler → **HTTP Request**,填写接口信息: - **Server Name/IP**: 目标接口域名(如`api.example.com`) - **HTTP Method**: GET/POST/PUT等 - **Path**: 接口路径(如`/user/login`) - **Parameters/Body Data**: 请求参数或JSON报文 ```plaintext 示例:登录接口参数 { "username": "test", "password": "123456" } ``` #### **3. 添加断言与监听器** - **响应断言**:验证接口返回是否成功 右键HTTP请求 → Add → Assertions → **Response Assertion**,设置检查条件(如响应代码=200,内容包含`"success": true`) - **监听器**:收集试结果 常用监听器: - **View Results Tree**:查看请求详情(调试用,正式试时禁用) - **Summary Report**:汇总响应时间、TPS等 - **Aggregate Graph**:图形化展示性能指标[^2] #### **4. 运行试并分析** - 点击工具栏绿色箭头启动试。 - 查看监听器数据,重点关注: - **TPS(Transactions Per Second)**:系统吞吐量,如引用示例中峰值达到$317.6$次/秒[^5] - **响应时间分布**:90%请求的响应时间应低于阈值(如示例中某接口响应时间从$7.7$秒升至$24$秒需优化[^5]) - **错误率**:异常请求比例(需接近$0\%$) #### **5. 实战示例:稳定性试** 假设需验证系统在$50$并发下的稳定性: 1. 设置Thread Group参数:50线程,持续运行30分钟。 2. 使用**Synchronizing Timer**模拟瞬时高并发。 3. 通过**CSV Data Set Config**参数化用户名、密码,避免重复数据干扰。 4. 分析结果:若TPS稳定在$10.83$次/秒(计算:$50 \times 13 / 60 \approx 10.83$)且无错误,则符合预期[^5]。 #### **6. 扩展工具推荐** - **MeterSphere**:兼容JMeter脚本的一站式试平台,支持分布式和自动化报告。 #### **注意事项** - **参数化**:使用CSV文件或随机变量模拟真实用户行为。 - **资源监控**:结合服务器CPU、内存使用率分析瓶颈。 - **分布式**:通过多台机器分担负载,提升规模。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值