1、并发测试的几种简单方法

article/2025/11/5 12:57:24

文章目录

  • 一、AB
  • 二、postman
    • 1、添加 Collection
    • 2、添加要测试的URL
    • 3、选中添加的Collection,设置运行时参数
    • 4、结果如下
  • 三、JMeter
  • 四、代码模拟
  • 五、Testng 并发测试
    • 1、注解方式
    • 2、配置文件方式


本文介绍几种简单的并发测试方法。
本文分为五部分,即ab、postman、jmeter、代码模拟、testng。

一、AB

ApacheBench 是 Apache 服务器自带的一个web压力测试工具,简称ab。
ab又是一个命令行工具,对发起负载的本机要求很低,根据ab命令可以创建很多的并发访问线程,模拟多个访问者同时对某一URL地址进行访问,因此可以用来测试目标服务器的负载压力。总的来说ab工具小巧简单,可以提供需要的基本性能指标,但是没有图形化结果,不能监控。
执行命令 ab -n -c url

二、postman

1、添加 Collection

可以改名称
在这里插入图片描述

2、添加要测试的URL

在这里插入图片描述
添加请求的测试相关信息,并设置测试通过的判断条件,本示例仅仅以返回状态200为标准。设置完成后要点击保存。
在这里插入图片描述
多添加几个请求或只添加一个请求,都可以。添加完成后进行测试。

3、选中添加的Collection,设置运行时参数

在这里插入图片描述
在这里插入图片描述

4、结果如下

在这里插入图片描述

三、JMeter

Meter也是一款性能测试工具,是图形化的。
http://jmeter.apache.org/
功能比较多,详细参考官方网站

四、代码模拟

CountDownLatch是一个计数器闭锁,通过它可以完成类似于阻塞当前线程的功能,即:一个线程或多个线程一直等待,直到其他线程执行的操作完成。
CountDownLatch用一个给定的计数器来初始化,该计数器的操作是原子操作,即同时只能有一个线程去操作该计数器。调用该类await方法的线程会一直处于阻塞状态,直到其他线程调用countDown方法使当前计数器的值变为零,每次调用countDown计数器的值减1。当计数器值减至零时,所有因调用await()方法而处于等待状态的线程就会继续往下执行。这种现象只会出现一次,因为计数器不能被重置。
下图和它的方法可以体现出来:
在这里插入图片描述

// CountDownLatch类只提供了一个构造器
//参数count为计数值
public CountDownLatch(int count) {  };   
//下面这3个方法是CountDownLatch类中最重要的方法(上图能够反映出来)
//调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行
public void await() throws InterruptedException { };    
//和await()类似,只不过等待一定的时间后count值还没变为0的话就会继续执行
public boolean await(long timeout, TimeUnit unit) throws InterruptedException { };   
//将count值减1
public void countDown() { };  

还需要看一个类Semaphore
Semaphore与CountDownLatch相似,不同的地方在于Semaphore的值被获取到后是可以释放的,并不像CountDownLatch那样一直减到底。
它也被更多地用来限制流量,类似阀门的 功能。如果限定某些资源最多有N个线程可以访问,那么超过N个主不允许再有线程来访问,同时当现有线程结束后,就会释放,然后允许新的线程进来。有点类似于锁的lock与 unlock过程。相对来说他也有两个主要的方法:

  • 用于获取权限的acquire(),其底层实现与CountDownLatch.countdown()类似;
  • 用于释放权限的release(),其底层实现与acquire()是一个互逆的过程。
    通过这两个类可以进行并发的模拟:
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.*;@Slf4j
public class CuncurrencyTest {// 请求总数public static int clientTotal = 5000;// 同时并发执行的线程总数public static int threadTotal = 200;public static int count = 0;public static void main(String[] args) throws InterruptedException {// 定义线程池ExecutorService executorService = Executors.newCachedThreadPool();// 定义信号量 最大的线程数量final Semaphore semaphore = new Semaphore(threadTotal);final CountDownLatch countDownLatch = new CountDownLatch(clientTotal);for (int i = 0; i < clientTotal; i++) {executorService.execute(() -> {try {semaphore.acquire();add();semaphore.release();} catch (InterruptedException e) {e.printStackTrace();log.error("exception", e);}countDownLatch.countDown();});}countDownLatch.await();executorService.shutdown();log.info("count:{}", count);}private static void add() {count++;}
}

五、Testng 并发测试

1、注解方式

@Test注解上可通过配置threadPoolSize来实现并发,threadPoolSize和invocationCount是结合使用的,当invocationCount=1的时候,threadPoolSize没有意义。invocationCount表示方法被调用的次数,如果不配置threadPoolSize,该方法会被顺序执行5次,如果配置threaPoolSize=4,下图所示的方法会一次以4个线程并发执行,缩短执行时间。
下面的例子是输出进程ID,threadPoolSize用来指明线程池的大小,也就是并发的线程数目是多少。5次调用,有3个线程可调用。

@Test(invocationCount = 50, threadPoolSize = 3)
public void test() {System.out.println(1);System.out.printf("Thrad Id : %s%n", Thread.currentThread().getId());
}

2、配置文件方式

TestNG可以以多线程的模式运行所有的test,这样可以获得最大的运行速度,最大限度的节约执行时间。当然,并发运行也是有代价的,就是需要我们的代码是线程安全的。
并发运行测试的话,需要我们指定运行的配置文件,一个示例如下:

<suite name="My suite" parallel="methods" thread-count="4">
#说明:在当前测试规划的执行过程中,为每个测试方法的执行使用单独的线程,最多并发4个线程。<suite name="My suite" parallel="tests" thread-count="4">
# 说明:在当前测试规划的执行过程中,为每个测试用例的执行使用单独的线程(该测试用例中的测试方法共享一个线程),最多并发4个线程。<suite name="My suite" parallel="classes" thread-count="4">
# 说明:在当前测试规划的执行过程中,为每个测试类的执行使用单独的线程(该测试类中的测试方法共享一个线程),最多并发4个线程。
<suite name="My suite" parallel="instances" thread-count="4">
# 说明:在当前测试规划的执行过程中,为每个测试类实例的执行始终使用唯一的线程(该测试实例中的测试方法共享一个线程),最多并发4个线程。
#注意:这里的parallel默认值为"none"。曾经的"true", "false"已经过时了,不建议使用。
#1.Parallel=”methods”的意思是指TestNG会将method作为并发的元子单位,即每个method运行在自己的thread中。如果parallel=”tests”,则指会将test 作为并发的元子单位
#2.Thread-count=”2”是指,运行的时候,并发度为2,同时会有两个线程在运行。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"><suite name="Suite" parallel="methods" thread-count="2"><test verbose="1" preserve-order="true" name="Test1"><classes><!-- 可以多个 --><class name="org.eureka.client.userservice.test.Test1" /></classes></test></suite>

public class Test1 {@Test(groups = { "testng-cuncurrency" })public void aThreadPool() {System.out.println("#ThreadA: " + Thread.currentThread().getId());}@Test(groups = { "testng-cuncurrency" })public void bThreadPool() {System.out.println("#ThreadB: " + Thread.currentThread().getId());}@Test(groups = { "testng-cuncurrency" })public void cThreadPool() {System.out.println("#ThreadC: " + Thread.currentThread().getId());}
}

测试结果
在这里插入图片描述
按照上述配置修改查看结果即可。

以上,极其简单的介绍了并发测试的几种方法,本专栏主要是介绍spring cloud及其相关组件的。


http://chatgpt.dhexx.cn/article/qKIahvSc.shtml

相关文章

Jmeter实现并发测试

在实际测试过程中&#xff0c;需要对某些业务进行并发测试&#xff0c;模拟绝对并发时系统的处理是否有异常。比如支付场景&#xff0c;如果有一些秒杀或者其他优惠活动时&#xff0c;很可能有多用户并发的场景发生&#xff0c;下面就针对支付的并发场景&#xff0c;使用Jmeter…

pearson特征选择matlab,常用的特征选择方法之 Pearson 相关系数

众所周知&#xff0c;特征选择是机器学习活动至关重要的一步。最理想的情况下&#xff0c;我们把所有影响目标的独立因素给找出来&#xff0c;然后使用合适的量化手段&#xff0c;就能够得到完美描述目标问题的特征列表&#xff0c;用这些特征去建立合适容量的模型&#xff0c;…

机器学习特征选择方法

文章目录 前言特征选择过滤法Pearson系数卡方检验互信息和最大信息系数距离相关系数方差选择法 包装法嵌入法 总结 前言 最近在看吴恩达的深度学习机器学习课程。地址&#xff1a;deeplearningai。课程在机器学习特征工程的课程中提到特征选择。在机器学习项目生命周期里&…

特征选择-单变量特征选择

1.SelectKBest可以依据相关性对特征进行选择&#xff0c;保留k个评分最高的特征。 ①方差分析 分类问题使用f_classif&#xff0c;回归问题使用f_regression。 f_classif&#xff1a;分类任务 跟目标的分类&#xff0c;将样本划分成n个子集&#xff0c;S1,S2,..,Sn&#xf…

特征选择的几种方法

目录 1、 过滤法&#xff08;Filter&#xff09; 1.1 方差选择法 1.2 相关系数法 1.3 卡方检验 1.4 互信息法 1.5 relief算法 2、包裹法&#xff08;Wrapper&#xff09; 2.1 递归特征消除法 2.2 特征干扰法 3、嵌入法&#xff08;Embedded&#xff09; 3.1 基于惩罚…

特征选择-嵌入式选择

嵌入式特征选择是将特征选择过程与学习器训练过程融为一体&#xff0c;两者在同一个优化过程中完成&#xff0c;即在学习器训练过程中自动地进行了特征选择。 基于惩罚项的特征选择法 给定数据集 D { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ &ThinSpace; , ( x n , y n ) }…

特征选择案例

特征降维&#xff08;P443&#xff09; 特征降低维度分两种方法&#xff1a;特征选择和特征抽取。 特征选择&#xff1a;选择全部特征的一个子集作为特征向量。 特征抽取&#xff1a;通过已有特征的组合建立一个新的特征子集。 主成分分析方法&#xff08;PCA&#xff09;就…

机器学习-特征选择

特征选择 1、简述特征选择的目的。 减轻维数灾难问题&#xff1a;特征个数越多&#xff0c;模型也会越复杂&#xff0c;其泛化能力会下降。 降低学习任务的难度&#xff1a; 特征个数越多&#xff0c;分析特征、训练模型所需的时间就越长。 特征选择能够明显的改善学习器的精…

lasso特征选择python_特征选择怎么做?这篇文章告诉你

原标题:特征选择怎么做?这篇文章告诉你 照片由 Clem Onojeghuo 发布在 Unsplash 上面 作者 | Pier Paolo Ippolito 翻译 | Skura 编辑 | 唐里 原文标题:Feature Selection Techniques 原文链接:https://towardsdatascience.com/feature-selection-techniques-1bfab5fe0784 …

python方差特征选择_特征选择-Filter过滤法(方差)

3.1 Filter过滤法 过滤方法通常用作预处理步骤,特征选择完全独立于任何机器学习算法。它是根据各种统计检验中的分数以及相关 性的各项指标来选择特征。 3.1.1 方差过滤 3.1.1.1 VarianceThreshold 这是通过特征本身的方差来筛选特征的类。比如一个特征本身的方差很小,就表示…

特征选择与特征提取

目录 一、 特征选择1、特征2、特征选择3、扩展——特征选择算法(有兴趣和精力可了解)拓展--完全搜索:拓展--启发式搜索:拓展--随机搜索:拓展--遗传算法: 二、 特征提取三、特征提取主要方法——PCA(主成分分析)1、PCA算法是如何实现的&#xff1f;PCA--零均值化&#xff08;中心…

特征选择简述

目录 一、 特征选择的意义 二、特征选择的方法 1. 排序方法&#xff08;Ranking methods&#xff09; 2. 过滤方法&#xff08;Filter approaches&#xff09; 3.包装器方法&#xff08;wrapper methods&#xff09; 4.混合方法&#xff08;Hybrid methods&#xff09; …

特征提取与特征选择

特征抽取和特征选择是DimensionalityReduction&#xff08;降维&#xff09;的两种方法&#xff0c;针对于the curse of dimensionality(维度灾难)&#xff0c;都可以达到降维的目的。但是这两个有所不同。 特征提取&#xff08;Feature Extraction&#xff09;&#xff1a;Cre…

特征选择方法总结

问题 在数据处理中经常会遇到特征太多造成的计算负担和一些其他的影响&#xff0c;如过拟合等&#xff0c;不但使得预测结果不准确&#xff0c;还消耗计算时间。所以特征选择就显得非常重要了。 特征选择&#xff1a;从给定的特征集合中选取出相关特征子集的过程成为“特征选择…

利用sklearn进行特征选择

3种特征选择 Filter 过滤法&#xff0c;按照发散性或者相关性对各个特征进行评分&#xff0c;设定阈值或者待选择阈值的个数&#xff0c;选择特征。 &#xff08;先对数据集进行特征选择&#xff0c;然后再训练学习器&#xff09; Wrapper 包装法&#xff0c;根据目标函数&…

如何进行特征选择

如何进行特征选择 原文地址&#xff1a; http://blog.csdn.net/u010670689/article/details/73196546 特征选择对于数据科学家、机器学习从业者来说非常重要。好的特征选择能够提升模型的性能&#xff0c;更能帮助我们理解数据的特点、底层结构&#xff0c;这对进一步改善模型、…

光谱特征选择

光谱特征选择&#xff08;谱特征选择&#xff09; 简介算法框架算法推导总结 Spectral feature selection可翻译为谱特征选择&#xff0c;之前的特征提取学习中陷入了光谱特征选择翻译的误区。 参考论文为"Spectral feature selection for supervised and unsupervised le…

模型特征选择

RF、GBDT、XGboost都可以做特征选择&#xff0c;属于特征选择中的嵌入式方法。比如在sklearn中&#xff0c;可以用属性feature_importances_去查看特征的重要度, 比如&#xff1a; from sklearn import ensemble#grd ensemble.GradientBoostingClassifier(n_estimators30)grd …

sklearn 数据处理与特征工程

1、数据处理的流程 2 数据预处理 Preprocessing & Impute 2.1 数据无量纲化 在机器学习算法实践中&#xff0c;我们往往有着将不同规格的数据转换到同一规格&#xff0c;或不同分布的数据转换到某个特定分布的需求&#xff0c;这种需求统称为将数据“无量纲化”。譬如梯度…

特征选择

一、特征选择基本问题 我们将属性称为“特征”&#xff08;feature&#xff09;&#xff0c;对当前学习任务有用的属性称为“相关特征”&#xff08;relevant feature&#xff09;、没什么用的属性称为“无关特征”&#xff08;irrelevant feature&#xff09;。 从给定的特征集…