1.什么是性能测试
 
1.什么是性能
 


 
就像这两个车一样,虽然都是代步工具,构造都是一样的,但是路虎的发动机要比捷达好.路虎的百米加速却是比捷达快的,我们就知道路虎的性能要比捷达好 .
 
那么什么是软件的性能呢?我们分析一下
 
2.常见的性能测试指标
 
2.1并发数
 
并发数是指在同一时间点上,系统能够同时处理的请求或任务的数量.比如:"双十一电商大战".此时各大电商平台在某一时间段突然涌入大量的用户,下单商品.如果系统承受不住高并发的压力,就会挂掉.
 
2.2 吞吐量
 
 
 单位时间内处理的并发数,直接体现软件系统负载承受能⼒。吞吐量越⾼,系统承受的并发越  
 
 
 多,性能越好。 
 
 
  吞吐量反映了系统在一定时间内完成工作的能力。例如,在网络通信中,吞吐量可以表示为单位时间内成功传输的数据量 
 
2.3 响应时间
 
 
 应⽤系统从请求发出开始,到客⼾端接收到最后⼀个字节数据所消耗的时间。  
 
  响应时间反映了系统对请求的处理速度。在不同的应用场景中,响应时间的具体含义和重要性有所不同。例如,在网页浏览中,响应时间是指从用户点击链接或提交表单到浏览器接收到完整页面内容并显示出来的时间。对于在线交易系统,响应时间则是从用户提交交易请求到系统返回交易结果的时间 
 
 
2.4 并发数,吞吐量,响应时间的关系
 

 
 
 当并发⽤⼾较少,系统吞吐量低,系统响应时间较短,我们认为系统处于空闲区间。随着系统并发⽤⼾增加,系统吞吐量开始呈线性增⻓,系统性能进⼊了线性增⻓区间。 
 吞吐量在某个点上达到了饱和点,也称之为拐点。在这之后⽤⼾请求不再被⽴即处理,响应时间随之 
 变⻓,吞吐量也逐渐降低,系统性能进⼊了过饱和区间。 
 
 
 
 
 2.5 事务
 
  
  ⼀个接⼝可以是⼀个事务,多个接⼝也可以是事务,⼀个流程可以是事务,事务代表⼀个完整的功  
 
 
  
  能。用户登录接口我们就视为一个事务.而我们的下单事务,可能包含多个接口,比如商品下单,支付信息等,包含很多接口,我们把这个也称为一个事务.银行转账系统中,从一个账户扣除一定金额并将其添加到另一个账户的操作就是一个事务。 
 
 
 TPS和QPS
 
 TPS:每秒处理事务数,⽤于衡量系统在⼀定时间内能够处理的事务数
 
 QPS:每秒查询率.是用于衡量系统每秒能够处理的查询请求数量的指标,常用于评估数据库、搜索引擎、Web 服务器等系统的性能。
 
 资源利用率
 
 观察CPU,内存,硬盘的使用信息
 
 
 
 3.性能测试分类
 
 3.1基准测试
 
  
  基准测试(Benchmark Testing)⼜称单⽤⼾测试,主要⽤于监测被测系统在较低压⼒下的运⾏状  
 
 
  
  况并记录相关数据。当性能测试环境确定以后,通常选取业务模型中的重要业务做基准测试,对  
 
 
  
  被测系统施加⼀定压⼒,从⽽获取被测系统在单⽤⼾运⾏情况下的各项性能指标,为多⽤⼾并发  
 
 
  
  测试和混合场景测试等提供参考依据 
 
 
 3.2并发测试
 
  
  并发测试(Concurrency Testing)⽤于评估被测系统的某些特定操作同时发⽣时的性能表现,例  
 
 
  
  如,被测系统被多个⽤⼾同时登录时的响应能⼒,或系统的某⼀功能被多个⽤⼾同时操作时的性  
 
 
  
  能表现。 
 
 
 3.3负载测试
 
  
  负载测试是通过逐步加载的⽅式来确定系统的处理能⼒。负载测试  
 
 
  
  类似于举重运动,通过不断给运动员增加重量,确定运动员在其⾝体状况保持正常的情况下所能  
 
 
  
  举起的最⼤重量。通过负载测试可以获取系统能够达到的峰值指标。 
 
 
  
  
   
   例如,⼀个软件系统的响应时间要求不超过2秒,如果在这个前提下不断增加⽤⼾访问量,系统  
  
 
   
   的响应时间就会变⻓。假设当访问量超过1万⼈时系统的响应时间超过2秒,那么就可以确定在系  
  
 
   
   统响应时间不超过2秒的前提下,系统的最⼤负载量是1万⼈。负载测试可⽤于系统的性能验证、  
  
 
   
   性能诊断和性能调优等场景 
  
 
  3.4压力测试
 
   
   进⾏压⼒测试时通常采⽤逐步增加系统负载的⽅式,使系统某些资源达到饱和甚⾄失  
  
 
   
   效,从⽽发现那些只有在⾼负载条件下才会出现的缺陷,如同步问题、内存泄漏等。通过对被测  
  
 
   
   系统进⾏压⼒测试,也能找出被测系统的性能拐点,获得系统所能提供的最⼤服务级别(系统所  
  
 
   
   能承受的最⼤压⼒),评估系统在峰值负载或超出最⼤负载情况下的处理能⼒。压⼒测试主要⽤  
  
 
   
   于性能诊断、性能调优和容量规划等场景 
  
 
   
   
   
    
    负载测试是在保持性能指标要求的前提下测试系统能够承受的最⼤负  
   
 
    
    载,⽽压⼒测试则是测试系统性能达到极限的状态. 
   
 
    
    
 
    4.性能测试实战
 
    4.1安装性能测试工具
 
    1.性能测试工具我们这里使用jmeter.
 
    Apache JMeter - Apache JMeter™ https://jmeter.apache.org/2.打开jmeter
https://jmeter.apache.org/2.打开jmeter
 
    
 
    3.每次打开都很费劲,所以我们添加环境变量在命令行打开
 
    
 
    
 
    4.2操作 jmeter进行性能测试
 
    4.2.1添加线程组
 
    线程组就是模拟用户发送请求
 
     
 
    
 
    4.2.2添加请求
 
    
 
    这一步就是构造访问请求,接下来我们对登录接口进行性能测试
 
    
 
    构造完请求之后我们要观察结果,所以加入"查看结果树"
 
    
 
    接下来我们运行观察结果,我们看到返回的结果都是正确的
 
    
 
     
    
   
  
 
 4.2.3 重要组件
 
前面我们已经使用了线程组和HTTP请求组件,接下来我们介绍一些比较常用的组件
 
4.2.3.1 HTTP请求默认值
 
每次对一个接口进行性能测试都要在HTTP请求器中输入IP,端口,十分麻烦.所以我们就可以使用HTTP请求默认值这个组件来将IP地址和端口号设置成默认值,这样我们就不要每次发送请求的时候重复输入了
 

 

 
设置好了之后后续我们构造HTTP请求器的时候就不用输入了
 
 
4.2.3.2 CSV数据文件格式
 
 
 以登陆接⼝为例,当我们执⾏登陆接⼝的性能测试时,⼿动配置了⽤⼾名和密码为固定的username和password,然⽽实际使⽤中不可能只有⼀个⽤⼾登陆,为了模拟更真实的登录环境,我们需要提供更多的⽤⼾username和password来实现登录操作 
 
 
 
 
  文件名: 
 填写csv⽂件的路径。建议使⽤绝对路径。(创建一个excel表格,写完数据之后存储到本次创建的测试项目路径下) 
 
 
  文件编码:UTF-8 
 
  变量名称( 
 从csv数据⽂件中读起的数据需要保存到的变量名。有多个变量时⽤逗号分隔) 
 
 
 是否忽略⾸⾏:是否从csv数据⽂件第⼀⾏开始读取 
 
 
 分隔符:要求与csv数据⽂件中多列的分隔符⼀致 
 
 
  
  遇到⽂件结束符再次循环:若选择为True当数据不够的时候会从头取。若选择False,则需要勾选  
 
 
  
  下⾯的配置,遇到⽂件结束符停⽌线程,这⾥如果不勾选,请求将会报错。 
 
 
  
  
 
  1.创建csv文件
 
  
 
  2.修改登陆接⼝及其他涉及到username和password获取的参数
 
  
 
   
   修改完该配置后,登陆接⼝发起请求时将从csv⽂件中获取配置好的username和password参数,获取顺序为从上往下依次获取 
  
 
   
   
   3. 
   修改线程组中线程数,使得每次取到的username和password都不⼀样 
  
 
   
  
    4.运行结果 
  
 
   
    
 
    
   
   
   
 
   4.2.3.3 JSON提取器
 
   在我们设计后端服务器代码的时候,为了防止用户跳过登录,直接访问我们的其他页面,我们设置了拦截器,访问页面必须要携带token或者session.而只有在登录的时候才会生成.我们通过url直接访问页面就会受到拦截.
 
   但是在我们做性能测试的时候,都是对一个一个接口进行测试,不是完整的测试一个流程.所以其他的接口不会携带token或者session,所以返回的就是失败.所以我们就要用到json提取器.将token从登录返回的响应中提取出来,放到HTTP信息头管理器中,其他的接口也就可以拿到token,进而可以访问了
 
   
 
   
 
   
 
   如何从登录中获取token,这里我们使用JSON提取(其实还有很多方法,这里就不一一列举了)
 
   
 
   
 
   4.2.3.4 JSON断言
 
   接口请求成功返回状态码200并不能完全代表接口请求成功,我们还要关注返回的数据是否符合预期
 
   (1)添加断言
 
   
 
    
    针对某⼀个HTTP请求接⼝添加JSON断⾔ 
   
 
    
   
     (2).添加JSON断言配置 
   
 
    
     
 
     
    
    
     
     注意:  
    
 
     
     1)若不选Additionally assert value,表⽰添加断⾔值,则可⽤来判断字段是否存在  
    
 
     
     2)选择Additionally assert value,则必须添加Expected Value期望的断⾔值  
    
 
     
     3)若不选Match as regular expression正则匹配,则Expected Value必须填写完整,少⼀个字符都  
    
 
     
     会导致断⾔失败  
    
 
     
     4)若选择Match as regular expression正则匹配,则Expected Value可以仅写上部分关键词即可断  
    
 
     
     ⾔成功 
    
 
     
     
     
 
     4.2.3.5 同步定时器
 
     
 
      
      JMeter同步定时器的作⽤主要在于模拟多⽤⼾并发访问的场景,确保多个线程能够同时执⾏某个操  
     
 
      
      作,以达到真正的并发效果。  
     
 
      
      当多个线程同时启动时,它们可能会在不同的时间间隔内执⾏,这样就⽆法达到真正的并发效果。同 步定时器的作⽤就是将这些线程的执⾏时间同步,使它们在同⼀时间点执⾏。它可以在多个线程之间 制造⼀定的延迟,直到同时到达指定时间点,再同时执⾏后续的操作。  
     
 
      
      此外,同步定时器可以理解为集合点,当线程数量达到指定值后,再⼀起释放,可以瞬间产⽣很⼤的 压⼒。这样,可以更好地模拟真实的⽤⼾并发访问场景,提⾼测试的准确性和可靠性。  
     
 
      
      在性能测试过程中,为了真实模拟多个⽤⼾同时进⾏操作以度量服务器的处理能⼒,可以使⽤同步定 时器来设置集合点。不过,虽然通过加⼊集合点可以约束请求同时发送,但不能确保请求同时到达服 务器,所以只能说是较真实模拟并发 
     
 
      
      
       
       现实⽣活中,红绿灯就相当于⼀个集合点,有⼈先到达,有⼈后达到,但必须等到绿灯后所有⼈才能开始过⼈⾏道。 
      
 
       
       
 
       4.2.3.6 事务控制器
 
        
        Meter事务控制器的作⽤主要⽤于测试执⾏嵌套测试元素所花费的总时间。这相当于模拟⽤⼾进⾏⼀系列操作的测试。  
       
 
        
        在进⾏⻚⾯性能测试或API性能测试时,事务控制器是⼀个⾮常重要的⼯具。它可以帮助测试⼈员更准确地评估系统性能,尤其是在涉及多个接⼝或操作的复杂场景中。例如,在订单提交的过程中,可能 需要调⽤多个接⼝,并且某些接⼝可能依赖于前⼀个接⼝的结果。在这种情况下,使⽤事务控制器可以将这些接⼝统⼀视为⼀个事务进⾏性能测试,从⽽得到更接近真实场景的性能测试结果 
       
 
        
        
       
      
      
      
 
      4.2.3压力测试
 
      4.2.3.1 安装管理插件
 
      Install :: JMeter-Plugins.org A custom set of plugins for Apache JMeter, not affiliated with Apache Software Foundation, graphs, load shapers, new functions. https://jmeter-plugins.org/install/Install/下载监听器插件
https://jmeter-plugins.org/install/Install/下载监听器插件
 
      
 
      下载线程组插件
 
      
 
      安装完后
 
      
 
      
 
      4.2.3.2 Stepping Thread Group(梯度压测)
 
      
 
      
 
       
       This group will start:启动多少个线程,同线程组中的线程数  
      
 
       
       First, wait for:等待多少秒才开始压测,⼀般默认为0  
      
 
       
       Then start:⼀开始有多少个线程数,⼀般默认为0  
      
 
       
       Next,add:下⼀次增加多少个线程数  
      
 
       
       threads every:当前运⾏多⻓时间后再次启动线程,即每⼀次线程启动完成之后的的持续时间;  
      
 
       
       using ramp-up:启动线程的时间;若设置为5秒,表⽰每次启动线程都持续5秒  
      
 
       
       thenhold loadfor:线程全部启动完之后持续运⾏多⻓时间  
      
 
       
       finally,stop/threadsevery:多⻓时间释放多少个线程;若设置为5个和1秒,表⽰持续负载结束之后  
      
 
       
       每1秒钟释放5个线程 
      
 
      4.2.3.3 监听器
 
      聚合报告
 
      
 
      
 
      
 
       
       Response Times Over Time 
      
 
       
       
        
        Response Times Over Time的图形展⽰中,横坐标通常代表运⾏时间,⽽纵坐标则代表响应时间(单位是毫秒)。测试⼈员可以根据图形中的趋势线来判断响应时间的稳定性以及是否存在⼤的波动。例如,如果响应时间在某个时间点突然增加,这可能意味着系统在该时间点遇到了性能问题。 
       
 
        
        
 
         
         Transactions per Second(TPS) 
        
 
         
          
          JMeter中的Transactions per Second(TPS)监听器是⼀个⽤于分析系统吞吐量的重要⼯具。TPS 
         
 
          
          即每秒事务数,表⽰⼀个客⼾机向服务器发送请求后服务器做出反应的过程。这个指标反映了系统在 同⼀时间内处理业务的最⼤能⼒。TPS值越⾼,说明系统的处理能⼒越强 
         
 
          
          
           
           在使⽤TPS监听器时,横坐标通常代表运⾏时间,⽽纵坐标则代表TPS值。通过监听器展⽰的图表,可 以清晰地看到TPS值随时间的变化情况。在图表中,红⾊通常表⽰通过的TPS,⽽绿⾊可能表⽰失败的TPS。这有助于我们快速识别系统性能的变化和瓶颈 
          
 
           
          
          
          
 
          4.2.4测试报告
 
           
           JMeter测试报告是⼀个全⾯⽽详细的⽂档,它提供了关于测试执⾏结果的详细信息,帮助⽤⼾全⾯评估系统的性能并进⾏性能优化。⽣成性能测试报告的命令 
          
 
           
            
             
             Jmeter -n -t  
             脚本⽂件 
              -l  
             ⽇志⽂件 
              -e -o  
             ⽬录  
            
 
             
             
             -n  
             : ⽆图形化运⾏  
            
 
             
             -t  
             : 被运⾏的脚本  
            
 
             
             -l  
             : 将运⾏信息写⼊⽇志⽂件,后缀为 
             jtl 
             的⽇志⽂件  
            
 
             
             -e  
             : ⽣成测试报告  
            
 
             
             -o  
             : 指定报告输出⽬录 
            
 
             
             
          
 
           
          
         
        
       
      
     
    
   
  
注意:⽇志⽂件和⽬录可以不存在,若为已经存在的情况下需要保证内容为空,否则会出现错误! 
 


 
运行后:
 
