Java多线程Executors+Runnable+CyclicBarrier+HttpClient性能测试自动化工具 Author:HMF 2021/04/171.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调用
List5.2 算法性能测试 5.2.1 EncTask.java类dataList = Common.readData("./data.csv");
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 代码用到的工具包
序号 工具包或框架名 版本 1 Maven apache-maven-3.8.1 2 httpClient 4.5.3 3 logback 6.6 4 javax.mail 1.6.2 5 jsonpath 2.6.0 6 gson 2.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页开始)


![[Java多线程性能测试]Executors+Runnable+CyclicBarrier+HttpClient性能测试自动化工具 [Java多线程性能测试]Executors+Runnable+CyclicBarrier+HttpClient性能测试自动化工具](http://www.mshxw.com/aiimages/31/836017.png)
