• 14
  • 15
分享
  • 测试进阶:从0开始搭建测试体系——软件测试圈
  • 曼倩诙谐 2021-11-01 11:05:03 字数 3022 阅读 1592 收藏 15

  一、缓存测试

  缓存系统的使用,在一定程度上,极大的提升了应用程序的性能和效率,在秒杀系统的建设上,缓存系统出力不小,特别是数据查询方面,数据的快速返回广受好评。但同时,它也带来了一些问题,测试过程中,如果没有及时关注到缓存系统,整个测试环节是有遗漏的。缓存系统没有经过严格的测试,容易产生一个严重的问题,就是数据的一致性问题。如果没有对缓存系统进行测试,并且后端系统对数据的一致性要求很高,那么就不能使用缓存。

1-1.png

  缓存的主要作用:是将业务系统的数据处理结果,暂时在内存中保存,并且等待下次访问的时候,立马从内存中取出。在日常开发场景中,因为服务器的性能或者自身业务对数据处理非常耗时的时候,当发现业务系统的数据请求量很大的时候,频繁的IO和频繁的逻辑处理会导致硬盘和CPU资源的瓶颈出现。应用缓存系统,就是将这些数据保存在内存中,当有其他线程或者客户端,查询相同的数据资源时,直接从缓存的内存中返回数据,这样不但可以提高系统的响应速度,同时也可以节省这些数据的处理流程及资源消耗,整体上来说,系统性能会有大大的提升。

  二、redis介绍

  首先对redis做一个简单的了解。

  Redis数据类型:

1-2.png

  Redis常用命令:

1-3.png

  三、常见的缓存测试点

  常见的缓存系统请求及数据返回流程:

1-4.png

  在这请求过程中,我们经常会遇到的缓存测试点有:

  ·缓存数据更新:新增或者更新缓存数据,查看功能是否正确,查看数据是否正确

  ·缓存删除:缓存被删除之后,对业务系统的影响;缓存到了失效时间,是否根据缓存过期策略,被正确的删除;

  ·缓存穿透:缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能 数据库就挂掉了,要是有人利用不存在的 key 频繁攻击我们的应用,这就是漏洞。

  ·缓存雪崩:缓存雪崩是指在我们设置缓存时采用了相同的过期时间或者其他情况,导致缓存在某一时刻同时失效,请求全部转发到数据库,数据库瞬时压力过重雪崩。

  ·缓存服务停止:关闭缓存服务,查看系统运行情况

  ·缓存超时:缓存查询达到超时时间后,未返回指定数据,对系统的影响

  ·缓存数据恢复:缓存数据被误修改后,快速恢复到指定版本;缓存数据被误删除后,快速恢复数据

  四、Redis测试场景实战

  缓存穿透解决方案:

  空值缓存,如果一个查询返回的数据为空,我们仍然把这个结果进行缓存,但它的过期时间会很短,最长不超过五分钟。 通过这个直接设置的默认值存放到redis中,这样第二次到缓冲中获取就有值了,而不会继续访问数据库。

  方案代码:

   /**
     * 缓存穿透
     */
    @Test
    void redisTest1(){
        ValueOperations<String, String> operations = redisTemplate.opsForValue();
        //1、从缓存中读取数据
        String stringData = operations.get("HotWords");
        if(StringUtils.isEmpty(stringData)){
            //2、模拟从数据库中读取数据
            String stringFromDB = queryFromDB();
            if(StringUtils.isEmpty(stringFromDB)){
                //库中没有此数据,存入一个空值,过期时间为5分钟
                operations.set("HotWords","",5, TimeUnit.MINUTES);
                //返回数据,我这里是测试方法,所以返回空,
                return;
            }else{
                operations.set("HotWords",stringFromDB);
                return;
            }
        }
        //缓存中有数据,直接返回
        return;
    }

  测试点:在审计开发代码时,需要关注开发对空值的处理,取出数据后先进行非空校验,如果数据是空的,设置临时缓存数据。

  缓存雪崩解决方案:

  设置不同的过期时间,让缓存失效的时间点尽量均匀。

  方案代码:

@Test
    void redisTest1(){
        ValueOperations<String, String> operations = redisTemplate.opsForValue();
        //1、从缓存中读取数据
        String stringData = operations.get("HotWords");
        if(StringUtils.isEmpty(stringData)){
            //2、模拟从数据库中读取数据
            String stringFromDB = queryFromDB();
            if(StringUtils.isEmpty(stringFromDB)){
                //库中没有此数据,解决缓存穿透问题,存入一个空值,过期时间为5分钟
                operations.set("HotWords","",5, TimeUnit.MINUTES);
                //返回数据,我这里是测试方法,所以返回空,
                return;
            }else{
                //将数据写入缓存,并设置一个随机的过期时间,解决缓存雪崩问题
                //生成0-1000之间的一个随机数,设置缓存随机在5-15个小时内过期
                Random random = new Random();
                int randomNum = random.nextInt(1000);
                operations.set("HotWords",stringFromDB,randomNum,TimeUnit.HOURS);
                return;
            }
        }
        //缓存中有数据,直接返回
        return;
    }

  测试点:避免大量缓存集中在一段时间内失效,则会出现大量缓存穿透,所有的查询都落在数据库上,造成了缓存雪崩。 由于原有缓存失效,新缓存未存储,原来应该访问redis的请求都去访问数据库了,所以需要随机设置过期时间。



作者:Henry   

来源:http://www.51testing.com/html/52/n-4479252.html


2021 问卷礼物图.png

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   微信发红包测试用例  功能  1、在红包钱数和红包个数的输入框中只能输入数字;  2、红包最多最少的输入钱数200、0.01;  3、拼手气红包最多可以发多少个红包  4、超过最大拼手气红包是否有提醒;  5、当红包钱数超过最大范围是否有提醒;  6、余额不足时,红包发送失败,或者会不会匹配切换支付方式;  7、红包描述里是否可以输入表情汉字英文数字等;  8、红包描述里最多有多少个字符;  9、发送的红包别人是否能正常领取;  10、发送的红包自己可不可以领取;  11、24小时后别人没有领取的红包是否可以退回原来账户,或者是否还可以领取;  12、用户是否可以多次抢一个红包;  13、...
            11 12 2381
            分享
          • API测试已成为日常的测试任务之一,为了提高测试效率,减少重复的手工操作,API自动化测试也逐渐变得愈加重要,本文是自己在API自动化测试方面的一些经验积累和心得、汇总成文,以飨读者我相信自动化技能已经成为高级测试工程师总体技能的标配。敏捷和持续测试破坏了传统的测试自动化实践,导致测试工程师重新考虑自动化的完成方式。当今的自动化工程师需要在GUI的下方深入到API级别完成软件质量的保护。导致转向API测试的第二个变化是物联网。物联网是具有嵌入式功能的日常对象,允许它使用HTTP或HTTPS在Web上进行通信以与远程后端服务进行通信。下面分享一下API测试的基础使用指南:一、什么是API测试?应...
            0 0 1118
            分享
          • java数组Java数组在学习Java过程中属于比较重要的一个章节也是比较难的一个章节,作业带领大家讲解Java数组的一些相关操作。数组的概念 数组就是一组数据,我们定义变量会比较多,如果使用传统的方式,会出现的问题是变量很多,代码也很多,而且使用起来不方便。int t0 = 0 ;int t1 = 1 ;int t2 = 2 ;int t3 = 3 ;int t4 = 4 ;int t5 = 5 ;int t6 = 6 ;int t7...
            2 1 2473
            分享
          • 近些年,随着对于客户体验、管理水平、业务发展要求的提升,业务越来越复杂,迭代周期越来越快,如何做好提高功能测试质量?是很多技术负责人或者测试人员面对的问题。下面针对自己经验,分享一下功能测试精髓。一、功能测试面临的问题1、测试关联度复杂IT系统规模越来越大、集中度高、架构复杂、耦合度增强,使得业务和技术复杂度越来越高,测试设计和测试实施难度大,IT系统质量保障压力持续加大。2、测试周期越来越短业务需求提出到 IT 实现的周期越来越短,预留给测试的时间越来越短。面对复杂系统测试,如何压缩测试周期,提升测试效率,对测试部门管理能力和实施效率要求越来越高。3、测试组织与协同难测试规模越来越大、关联性...
            0 0 5268
            分享
          •   最近性能测试中遇到了一个内存泄漏相关的案例,在这里与大家分享。  什么是内存泄漏?  内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果[1]。  由于内存泄漏导致的缺陷具有隐蔽性、累积性的特点,技术人员通常不会直接观察到相关错误症状,而是通过系统性能表现逐渐降低或系统崩溃发现此类缺陷。  怎样发现内存泄漏缺陷?  疲劳测试是一般采用混合交易场景(待测交易按照一定比例),以一定的压力(通常不低于目标TPS)执行压力测试,验证混合场景长时间执行情况下系统的性能表现。  疲劳测试能够验证...
            14 14 1534
            分享
      • 51testing软件测试圈微信