jmeter入门

下载链接:http://jmeter.apache.org/download_jmeter.cgi

简介:
JMeter使用了不同技术和协议,是一款可以进行配置和执行负载测试、性能测试和压力测试的工具。

负载测试: 这类测试使系统或者应用程序在预先设计好的极端场景下测试运行。这类测试用来评估系统或者程序在极端条件下的行为。

性能测试: 这种测试被用来检测系统的性能表现,包括特定情况下,系统的响应能力和稳定性。

压力测试: 这类测试通过载入更多的外部资源,并使系统组件超越其所设定的能力范围,试图使系统挂掉

选择语言

java压力测试脚本 java项目压力测试_压测

添加线程组,设置线程组参数

java压力测试脚本 java项目压力测试_System_02

1000个线程数循环10次

java压力测试脚本 java项目压力测试_java压力测试脚本_03


设置默认http请求

java压力测试脚本 java项目压力测试_压测_04


设置默认协议、服务器名、端口号

java压力测试脚本 java项目压力测试_java压力测试脚本_05

压测的http请求(商品列表)

java压力测试脚本 java项目压力测试_java压力测试脚本_06


添加聚合报告

java压力测试脚本 java项目压力测试_压测_07


运行

java压力测试脚本 java项目压力测试_java压力测试脚本_08


聚合结果树(查看压测的相关数据)

java压力测试脚本 java项目压力测试_System_09

Redis压测(使用redis-benchmark)

通过redis自带的redis-benchmark进行测试

1、redis-benchmark -h 127.0.0.1 -p 6379 -c 100 -n 100000

100个并发连接,100000个请求

java压力测试脚本 java项目压力测试_压测_10


2、redis-benchmark -h 127.0.0.1 -p 6379 -q -d 100

以100 个字节测试

java压力测试脚本 java项目压力测试_System_11

3、redis-benchmark -t set,lpush -q -n 100000

只测试set,lpush

java压力测试脚本 java项目压力测试_System_12


4、redis-benchmark -n 100000 -q script load "redis.call(‘set’,‘foo’,‘set’)"

只测试某一条命令

java压力测试脚本 java项目压力测试_压测_13

JMeter命令行(linux)

1.在windows上录好jmx;
2.命令行:sh jmeter.sh -n -t XXX.jmx -l result.jtl
3.把result.jtl导入到jmeter

秒杀API的压力测试需要传入商品id和用户信息token(模拟不同token进行压测使用自定义变量)

添加工具类UserUtil(生成用户id和token,将生成用户id和token写到配置文件中)

public class UserUtil {
	
	private static void createUser(int count) throws Exception{
		List<MiaoshaUser> users = new ArrayList<MiaoshaUser>(count);
		//生成用户
		for(int i=0;i<count;i++) {
			MiaoshaUser user = new MiaoshaUser();
			user.setId(13000000000L+i);
			user.setLoginCount(1);
			user.setNickname("user"+i);
			user.setRegisterDate(new Date());
			user.setSalt("1a2b3c");
			user.setPassword(Md5Util.inputPassToDbPass("123456", user.getSalt()));
			users.add(user);
		}
		System.out.println("create user");
		//插入数据库
		Connection conn = DBUtil.getConn();
		String sql = "insert into miaosha_user(login_count, nickname, register_date, salt, password, id)values(?,?,?,?,?,?)";
		PreparedStatement pstmt = conn.prepareStatement(sql);
		for(int i=0;i<users.size();i++) {
			MiaoshaUser user = users.get(i);
			pstmt.setInt(1, user.getLoginCount());
			pstmt.setString(2, user.getNickname());
			pstmt.setTimestamp(3, new Timestamp(user.getRegisterDate().getTime()));
			pstmt.setString(4, user.getSalt());
			pstmt.setString(5, user.getPassword());
			pstmt.setLong(6, user.getId());
			pstmt.addBatch();
		}
		pstmt.executeBatch();
		pstmt.close();
		conn.close();
		System.out.println("insert to db");
		//登录,生成token
		String urlString = "http://localhost:8080/login/do_login";
		File file = new File("D:/tokens.txt");
		if(file.exists()) {
			file.delete();
		}
		RandomAccessFile raf = new RandomAccessFile(file, "rw");
		file.createNewFile();
		raf.seek(0);
		for(int i=0;i<users.size();i++) {
			MiaoshaUser user = users.get(i);
			URL url = new URL(urlString);
			HttpURLConnection co = (HttpURLConnection)url.openConnection();
			co.setRequestMethod("POST");
			co.setDoOutput(true);
			OutputStream out = co.getOutputStream();
			String params = "mobile="+user.getId()+"&password="+Md5Util.inputPassToFormPass("123456");
			out.write(params.getBytes());
			out.flush();
			InputStream inputStream = co.getInputStream();
			ByteArrayOutputStream bout = new ByteArrayOutputStream();
			byte buff[] = new byte[1024];
			int len = 0;
			while((len = inputStream.read(buff)) >= 0) {
				bout.write(buff, 0 ,len);
			}
			inputStream.close();
			bout.close();
			String response = new String(bout.toByteArray());
			JSONObject jo = JSON.parseObject(response);
			String token = jo.getString("data");
			System.out.println("create token : " + user.getId());
			
			String row = user.getId()+","+token;
			raf.seek(raf.length());
			raf.write(row.getBytes());
			raf.write("\r\n".getBytes());
			System.out.println("write to file : " + user.getId());
		}
		raf.close();
		
		System.out.println("over");
	}
	
	public static void main(String[] args)throws Exception {
		createUser(5000);
	}
}

修改LoginController的do_login:(返回token)

@RequestMapping("/do_login")
    @ResponseBody
    public Result<String> doLogin(HttpServletResponse response, @Valid LoginVo loginVo) {
    	log.info(loginVo.toString());
    	//登录
    	String token = userService.login(response, loginVo);
    	return Result.success(token);
    }

修改MiaoshaUserService的login:(返回token)

public String login(HttpServletResponse response, LoginVo loginVo) {
		if(loginVo == null) {
			throw new GlobalException(CodeMsg.SERVER_ERROR);
		}
		String mobile = loginVo.getMobile();
		String formPass = loginVo.getPassword();
		//判断手机号是否存在
		MiaoshaUser user = getById(Long.parseLong(mobile));
		if(user == null) {
			throw new GlobalException(CodeMsg.MOBILE_NOT_EXIST);
		}
		//验证密码
		String dbPass = user.getPassword();
		String saltDB = user.getSalt();
		String calcPass = MD5Util.formPassToDBPass(formPass, saltDB);
		if(!calcPass.equals(dbPass)) {
			throw new GlobalException(CodeMsg.PASSWORD_ERROR);
		}
		//生成cookie
		String token	 = UUIDUtil.uuid();
		addCookie(response, token, user);
		return token;
	}

先运行本机的方法,在运行工具类UserUtil生成用户配置文件(文件内容用户id和token)

添加csv数据文件配置

java压力测试脚本 java项目压力测试_System_14


选择之前工具包生成的配置文件,填写变量名,其他默认即可

java压力测试脚本 java项目压力测试_java压力测试脚本_15


秒杀请求压测(通过${}引用变量,使用生成文件中的用户信息)

java压力测试脚本 java项目压力测试_压测_16

聚合结果:

java压力测试脚本 java项目压力测试_System_17