51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1455|回复: 2
打印 上一主题 下一主题

hessian服务压力测试

[复制链接]
  • TA的每日心情
    无聊
    2024-9-19 09:07
  • 签到天数: 11 天

    连续签到: 2 天

    [LV.3]测试连长

    跳转到指定楼层
    1#
    发表于 2019-2-19 14:54:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    需求:现在的系统有一部分业务是通过hessian的远程服务提供的,为了应对不断的增长的服务器压力,需要对这个提供hessian服务的工程能承受的压力有一个比较详细的了解。

    hessian走的http的协议,但是其数据传输跟一般用户发起的http服务还是不一样的,做压力的测试的开源工具还是比较多的,类似jemeter,LoadRunner等都可以,但是这些都没法对hessian服务进行压力测试。

    方案1:创建一个web工程,在web工程提供一些http的服务,每个服务会对应的发起一个hessian请求,然后使用某些压力测试工具对这些http进行并发访问。
    方案2:自己写java程序,模拟压力测试,然后逐个测试hessian服务。

    方案一就不多说了,创建web工程,压力测试我们用的apache的ab test。

    方案二:
    我的想法是一次性创建X个线程模拟X个并发,然后每个线程循环Y次,每次发起一个hessian的请求,每次执行一次hessian请求,我会创建一个对象收集信息;然后创建一个监控线程,监控这些线程是否都执行完了,如果执行完了就对收集到的数据进行分析。

    信息收集对象:

    1. public class StopWatch {
    2.        
    3.         private long startTime;
    4.         private long endTime;
    5. // 一次hessian请求耗时
    6.         private long elapsedTime;
    7. //成功失败
    8.         private boolean status;
    9.        
    10.         public StopWatch(){
    11.                 this.startTime = 0L;
    12.                 this.endTime = 0L;
    13.                 this.elapsedTime = 0L;
    14.                 this.status = false;
    15.         }
    16.        
    17.         public long getStartTime() {
    18.                 return startTime;
    19.         }
    20.         public void setStartTime(long startTime) {
    21.                 this.startTime = startTime;
    22.         }
    23.         public long getEndTime() {
    24.                 return endTime;
    25.         }
    26.         public void setEndTime(long endTime) {
    27.                 this.endTime = endTime;
    28.         }
    29.         public boolean isStatus() {
    30.                 return status;
    31.         }
    32.         public void setStatus(boolean status) {
    33.                 this.status = status;
    34.         }
    35.         public long getElapsedTime() {
    36.                 return elapsedTime;
    37.         }
    38.         public void setElapsedTime(long elapsedTime) {
    39.                 this.elapsedTime = elapsedTime;
    40.         }

    41. }
    复制代码


    压力测试主程序:
    1. public class StressTest {
    2.        
    3.         private final static String url1 = "XXXXXXX";
    4.        
    5.         public static void main(String args[]) throws Throwable{
    6.                
    7.                 HessianProxyFactory hpf = new HessianProxyFactory();
    8.                 hpf.setChunkedPost(false);
    9.                 final UserManagerRemote userManagerRemote = (UserManagerRemote)hpf.create(url1);

    10. // 创建收集信息list
    11.                 final List<StopWatch> list = new ArrayList<StopWatch>(10000);
    12. //线程数量
    13.                 int count = 150;       
    14.                 final long start1 = System.currentTimeMillis();
    15. //创建循环栅栏,第一版我是创建了一个监控线程
    16.                 final CyclicBarrier barrier = new CyclicBarrier(count, new Runnable(){
    17.                                 @Override
    18.                                 public void run() {
    19.                                         long end1 = System.currentTimeMillis();
    20. //分析收集到的信息
    21.                                         analyseStopWatch(list, (end1-start1));
    22.                                 }
    23.                         }
    24.                 );
    25.                 for(int i=0; i<count; i++){
    26.                         Thread t = new Thread(
    27.                                 new Runnable(){
    28.                                         @Override
    29.                                         public void run() {
    30.                                                 for(int j=0; j<100; j++){
    31. //创建收集信息对象
    32.                                                         StopWatch sw = new StopWatch();
    33.                                                         long startTime = System.currentTimeMillis();
    34.                                                         sw.setStartTime(startTime);
    35.                                                         try {
    36.                                                                 userManagerRemote.get(****L);
    37.                                                                 sw.setStatus(true);
    38.                                                         } catch (Throwable e) {
    39.                                                                 sw.setStatus(false);
    40.                                                         }
    41.                                                         long endTime = System.currentTimeMillis();
    42.                                                         sw.setEndTime(endTime);
    43.                                                         sw.setElapsedTime(endTime-startTime);
    44. //将收集信息对象添加到list中
    45.                                                         list.add(sw);
    46.                                                 }
    47.                                                 try {
    48.                                                         barrier.await();
    49.                                                 } catch (InterruptedException e) {
    50.                                                         e.printStackTrace();
    51.                                                 } catch (BrokenBarrierException e) {
    52.                                                         e.printStackTrace();
    53.                                                 }
    54.                                         }
    55.                                        
    56.                                 }
    57.                         );
    58.                         if(i < 29){
    59.                                 t.setDaemon(true);
    60.                         }
    61.                         t.start();
    62.                 }
    63.                
    64.         }
    65.        
    66.         private static void analyseStopWatch(List<StopWatch> stopWatchs, long totalSpend){
    67.                
    68.                 System.out.println("size = "+stopWatchs.size());
    69.                 Collections.sort(stopWatchs, new Comparator<StopWatch>(){
    70.                         @Override
    71.                         public int compare(StopWatch o1, StopWatch o2) {
    72.                                 Long elapsedTime1 = o1.getElapsedTime();
    73.                                 Long elapsedTime2 = o2.getElapsedTime();
    74.                                 return elapsedTime1.compareTo(elapsedTime2);
    75.                         }
    76.                 });
    77.                 int size = stopWatchs.size();
    78.                 long min = 0;
    79.                 for(StopWatch sw : stopWatchs){
    80.                         if(sw.getElapsedTime() > 0){
    81.                                 min = sw.getElapsedTime();
    82.                                 break;
    83.                         }
    84.                 }
    85.                 System.out.println("spend time min = "+min+"MS   |   max = "+stopWatchs.get(size-1).getElapsedTime()+"MS");
    86.                 int failCount = 0;
    87.                 long spendTime = 0L;
    88.                 for(StopWatch sw : stopWatchs){
    89.                         spendTime +=sw.getElapsedTime();
    90.                         if(!sw.isStatus()){
    91.                                 failCount += 1;
    92.                         }
    93.                 }
    94.                 System.out.println("total spend time = "+totalSpend+"MS");
    95.                 System.out.println("total request count = "+size);
    96.                 double d1 = totalSpend;
    97.                 double d2 = size;
    98.                 double averageST = d1/d2;
    99.                 System.out.println("average spend time = "+spendTime/size+"MS");
    100.                 System.out.println("Transaction Per Second = "+(1000/averageST));
    101.                 System.out.println("total fail count = "+failCount);
    102.         }

    103. }
    复制代码


    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-25 06:26 , Processed in 0.072989 second(s), 22 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表