栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

[Java多线程性能测试]Executors+Runnable+CyclicBarrier+HttpClient性能测试自动化工具

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[Java多线程性能测试]Executors+Runnable+CyclicBarrier+HttpClient性能测试自动化工具

Java多线程Executors+Runnable+CyclicBarrier+HttpClient性能测试自动化工具
Author:HMF
2021/04/17
1.JAVA 性能测试自动化架构图

2.Java 性能测试背景 2.1性能测试代码目的

1、能够用代码编写自动化工具对客户端进行性能测试。

2、减少挨个执行,收集和统计数据的人工成本。

1).减少挨个执行性能命令的人工成本。

2).减少人工收集数据和统计数据的人工成本。

3).减少从管理平台新增客户端,下载客户端,安装客户端等准备工作的人工成本。

3、版本迭代过程中可以快速性能测试

2.2客户端性能测试代码需求

1、编写性能测试工具进行性能测试,收集数据并统计到文件中

2、能够跟管理平台结合,能够不用人工干预去下载客户端和安装客户端

3、测试结果能够发送邮件

2.3Java性能测试代码 2.3.1代码结构思维导图

2.3.2代码结构示例

 2.3.3代码实现功能描述

1、从管理平台新增客户端,查询和下载客户端,安装客户端,新增和查询密钥

2、客户端所有20个算法加密和解密性能测试

2.1.SM4算法 4种模式

2.2.AES算法4种模式

2.2.SM3摘要算法

3、测试结果发送邮件

3.主程序MainTest.java

主程序执行流程图

4.管理平台的web接口下载客户端,获取密钥

相关类:Web.java

工具类:HttpsClientUtils.java

4.1web接口新增和查询密钥
    
    public String selectModuleKey(){}
    
    public String addModuleKey(){}
4.2web接口新增和下载客户端
    
    public String  selectSDK(){}
    
    public void addSDK(){}
    
    public String selectSDKVersion() {}
    
    public void downloadSDK(String SDKModuleId,String templateId) {}
4.3Shell脚本安装客户端

Shell脚本:executeSDK.sh

#!/bin/bash
#Date=20220329
#Author HMF

uninstall_client()
{
    pwdDir=`pwd`
    cd $pwdDir
    echo "当前工程目录:"$pwdDir
    echo "-----------------------卸载客户端---------------------------"

    #删除安装的客户端
    caDir=`find /opt -name "ca"`
    if [ -d $caDir ];then
       rm -rf $caDir
       echo $caDir"客户端安装目录:/opt/ca存在,进行删除"
    fi

    #删除客户端解压后的目录和文件
    client_oldDir=$(ls -l |grep ^d |grep "client-" |awk '{print $9}')
    while read line
    do
      if [ -d $line ];then
        rm -rf $line
        echo "删除目录"$line
      fi
    done <<< "$client_oldDir"
    echo "---------------------------------------------------------"
}

install_client()
{
    clientZip=`ls client-*.zip`
    if [  -f "$clientZip" ]; then
      #客户端解压缩

      echo "-----------------------客户端解压缩---------------------------"
      unzip $clientZip
      echo "-----------------------------------------------------------"

      #进入安装包目录,执行安装
      clientDir=`ls -l |grep ^d |grep "客户端-" |awk '{print $9}'`
      cd $clientDir
      echo "进入客户端客户端解压后的目录:"$clientDir
      chmod +x client-install.sh
      echo "----------------------shell脚本安装客户端---------------------"

      sudo sh client-install.sh
      echo "-----------------------------------------------------------"

      #加载环境变量
      source /etc/profile
      echo "LD_LIBRARY_PATH:"$LD_LIBRARY_PATH

    fi
}

echo "----------------Java调用shell脚本解压/安装客户端客户端,开始-------------------"
uninstall_client
install_client
echo "----------------Java调用shell脚本解压/安装客户端客户端,结束-------------------"
5.读取数据,算法性能测试,数据存储 5.1读取数据方法 5.1.1 Common.java类的readData()方法
 
    public static List> readCSVFileData(String filePath){}   
    
    public static List  readData(String filePath){}
5.1.2 MainTest.java调用
List dataList = Common.readData("./data.csv");
5.2 算法性能测试 5.2.1 EncTask.java类
package com.cipherxx.crypto;

import com.cipherxx.ciphersuite.CipherSuiteUtils;
import java.util.concurrent.CyclicBarrier;
import com.cipherxx.bean.ThreadData;
import com.cipherxx.utils.Common;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


// 定义一个实现了 Runnable 接口的任务实现类
public class EncTask extends Common implements Runnable{
    private static Logger log = LoggerFactory.getLogger(EncTask.class);
    private CyclicBarrier barrier;
    private int loopNum;
    private int index;
    private String algorithm;
    private byte[] plain;
    private ThreadData threadData;

    public EncTask(CyclicBarrier barrier, int loopNum, int index, String algorithm, byte[] plain, ThreadData threadData){
        this.barrier = barrier;
        this.loopNum = loopNum;
        this.index = index;
        this.plain=plain;
        this.algorithm=algorithm;
        this.threadData=threadData;

    }

    
    @Override
    public void run(){
        try {
            BEGS[this.index] = System.currentTimeMillis();
            //System.out.println(Thread.currentThread().getName() + " 到达栅栏");
            //等待线程都到达栅栏,直到最后一个线程到达时,栅栏才会开门
            barrier.await();
            //System.out.println(Thread.currentThread().getName() + " 冲破栅栏");

            if (loopNum !=0) {
                for (int i=0;i 
5.2.2解密算法示例 

DecTask.java类

package com.cipherxx.crypto;

import com.cipherxx.ciphersuite.CipherSuiteUtils;
import com.cipherxx.bean.ThreadData;
import com.cipherxx.utils.Common;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.CyclicBarrier;



// 定义一个实现了 Runnable 接口的任务实现类
public class DecTask extends Common implements Runnable{
    private static Logger log = LoggerFactory.getLogger(DecTask.class);
    private CyclicBarrier barrier;
    private int loopNum;
    private int index;
    private String algorithm;
    private byte[] cipher;
    private ThreadData threadData;


    public DecTask(CyclicBarrier barrier, int loopNum, int index, String algorithm, byte[] cipher, ThreadData threadData){
        this.barrier = barrier;
        this.loopNum = loopNum;
        this.index = index;
        this.cipher=cipher;
        this.algorithm=algorithm;
        this.threadData=threadData;

    }
    
    @Override
    public void run() {
        try {
            BEGS[this.index] = System.currentTimeMillis();
            //System.out.println(Thread.currentThread().getName() + " 到达栅栏");
            //等待线程都到达栅栏,直到最后一个线程到达时,栅栏才会开门
            barrier.await();
            //System.out.println(Thread.currentThread().getName() + " 冲破栅栏");

            if (loopNum !=0) {
                for (int i=0;i 
5.2.3执行性能测试 

Common.java中的execute()方法

    
    public static ThreadData execute(ThreadData data){}
5.3数据存储 5.3.1 Common.java的方法writeCSVFileData()
    
    public static void writeCSVFileData(String filePath, ThreadData data){}
5.3.2 MainTest.java调用
               //写入result.csv
                Common.writeCSVFileData("./result.csv", outData);
6.测试结果发送邮件 6.1 MailUtil.java工具类
    
    public static boolean sendSimpleMail(Map contentMap){}
    

    public static boolean SendAttachMail(Map contentMap, List attachments){}
6.2 发送邮件调用

MainTest.java的sendMail方法

sendMail(mailFrom,passwd,mailTo,mailContent);
    
    public static void sendMail(String mailFrom,String passwd,String mailTo,String mailContent){}
6.3 测试结果邮件内容

7.JAVA 客户端自动化性能测试代码总结 7.1 代码用到的工具包
序号工具包或框架名版本
1Mavenapache-maven-3.8.1
2httpClient4.5.3
3logback6.6
4javax.mail1.6.2
5jsonpath2.6.0
6gson2.8.8
7.2 代码的优点

1、采用数据驱动方式来解决性能测试数据的输入

2、代码分层

3、针对返回JSON字符串,采用JSONPath和Gson结合的模式来精准判定JSON的内容。

4、测试结果放入excel表里收集和统计

5、测试完成后发送邮件,可以及时通知相关人员

7.3 学习参考资料

1、菜鸟编程-->Java 多线程编程

Java 多线程编程 | 菜鸟教程

2、JAVA视频->多线程编程169-183

 3、Java编程思想-->第21章:并发(651页开始)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/837995.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号