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

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

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 写在testng.xml的前面    TestNG运行的核心就是配置文件testng.xml,只要是使用TestNG框架的测试,最终都是通过testng.xml发起的测试。所以说testng.xml是TestNG的核心。    testng.xml的定义实际非常复杂,平时使用的仅仅是九牛一毛的功能而已。本篇是官网相关章节的翻译,部分内容增加了作者的理解,并给出一些实际的示例说明。testng.xml     TestNG可以通过如下方式运行:     (1)通过testng.xml&n...
            0 2 3836
            分享
          • 每年底除了对上一年的回顾以外,大家是不是都已经到了需要对下一年展望的时候?让我们回想一下过去的一年中,测试人员最烦的事情是什么呢?点点点比"点点点"更可怕的事情是什么呢?一直点点点不想一直点点点怎么办?上自动化!!!为什么公司之前没上自动化呢?老板一直没同意。。。以上的内心OS相信很多测试人员都经历过。反过来想一下,老板怎样会同意你的提议呢?一般的策略都是"动之以情,晓之以理"。动之以情这个改天展开说,就算是不混技术圈的老板,其实很多人对技术还是有一定的仰慕之情的。CC先生今天想聊聊的是晓之以理。金融学上一般会用ROI来判定一件事情是否值得做。Wikip...
            1 3 1972
            分享
          •   在备受瞩目的特斯拉AI日上,特斯拉CEO马斯克承诺:“通往可持续能源的道路清晰明了。”  刚刚上任的特斯拉全球生产负责人朱晓彤表示,特斯拉正在尽一切努力削减成本。  特斯拉正面临激烈的市场竞争。马斯克曾表示,特斯拉电动车的价格“高得令人尴尬”,可能会损害需求。  在AI日上,高管们提出了关于特斯拉如何扩大中国市场份额的问题,马斯克将问题抛给了朱晓彤。朱晓彤说道:“只要能以更低的价格提供有价值的产品,你就不必担心需求。”  特斯拉已经在电动汽车制造和利润方面遥遥领先于其竞争对手。该公司总工程师Lars Moravy表示,公司希望以目前Model 3或Model Y一半成本制造“下一代”汽车,...
            0 0 952
            分享
          • 做为功能测试人员来讲,从发展方向上可分两个方面:1、业务流程方向2、专业技能方向。 当确定好方向后,接下来就是如何达到了一、业务流程方向1、熟悉底层的业务作为功能测试工程师来讲,了解开发的框架、开发的业务设计流程以及数据库的底层结构,不管是对于我们熟悉业务还是在测试过程中遇到问题进行问题定位,都能给我们带来很大的帮助。所以在这个方面建议大家尽量去参加开的设计评审、数据库评审,另外在参加开发设计评审和数据库评审时还能提前发现问题。举个很简单的例子,之前我在工作中就真实的遇到过的,开发在设计数据库时,将一个URL字段设计成了64长度的字符串,这肯定是不合理的,为URL的长度很容易就超过64。当我们...
            0 0 1223
            分享
          • 1、引言因为小鱼在上一章节写了 多台appium的启动,然后就联想到 能不能搞一个多进程启动appium服务。于是乎~~那就搞起来~ ~关于并发的问题,小鱼写过专题文章《常见并发问题》《多线程并发》《多线程并发框架》但是呢,今天小鱼不写多线程并发,写个多进程并发在上代码之前,咱先弄清楚,多进程与多线程,到底有何区别:2、代码示例知道了多进程与多线程的区别, 我们就来写代码代码示例:# -*- coding: utf-8 -*- #@ auth : Carl_DJ #@ time : 2022-6...
            0 0 1713
            分享
      • 51testing软件测试圈微信