• 动态接口比例性能测试实践


    之前在性能测试中,我重新认识了随机数的功能性能测试中的随机数性能问题探索。但目前工作中接触到的都是静态的比例,即用例真正开始前,各个接口、场景的比例都是固定的。按照我的思路,旧会存在一个提前初始化完成的list,但是最近工作中遇到了需要在压测过程中(动态QPS模型),动态调整两个场景的比例值,计划是在某个范围内周期波动。

    其实核心问题:如何在一个变动的list随机实践中,保证线程安全。

    这里先分享一下从一个数组中随机取一个对象的思路,如下:

        /**
         * 随机选择某一个对象
         *
         * @param list
         * @param <F>
         * @return
         */
        public static <F> F random(List<F> list) {
            if (list == null || list.isEmpty()) ParamException.fail("数组不能为空!");
            return list.get(getRandomIntZero(list.size()));
        }
    
    

    可以看出这个方案中十分依赖list的size(),这也是在动态数组中随机面临的问题。我解决问题的方案是这样:

    1. 使用异步线程动态往list中添加和删除对应的元素
    2. 使用线程安全的类缓存list的size()
    3. 使用缓存的size进行随机,在增减前后重置参数

    这里再附加两个逻辑:

    1. 整个变化随着用例执行开始执行,用例结束而结束,使用同一个状态
    2. 间隔时间设置,间隔interval调整一次,调整N次之后倒置增减条件

    下面是我的异步实践:

    boolean upKey = false
            fun {
                //100s转变一次
                while (FunQpsConcurrent.key) {
                    if (upKey) {
                        10.times {
                            sleep(10.0)
                            size.getAndAdd(-reduce)
                            reduce.times {
                                PriapiWriteApiQpsConfig.apiList.remove(13 as Integer)
                            }
                            add.times {
                                PriapiWriteApiQpsConfig.apiList.add(10)
                            }
                            size.getAndAdd(add)
                        }
                    } else {
                        10.times {
                            sleep(10.0)
                            reduce.times {
                                PriapiWriteApiQpsConfig.apiList.add(13 as Integer)
                            }
                            size.getAndAdd(reduce)
                            size.getAndAdd(-add)
                            add.times {
                                PriapiWriteApiQpsConfig.apiList.remove(10 as Integer)
                            }
                        }
                    }
                    upKey = !upKey
                }
            }
    

    其中缓存size的代码: static AtomicInteger size = new AtomicInteger()

    这里已经实现了预设需求。其中两点:

    1. 增加list长度,先调整list,然后调整缓存。减少list长度,先减少缓存,然后调整list。
    2. 这里使用了java.util.concurrent.atomic.AtomicInteger,其实并不是必要的,可以使用int也是可以的。

    下面是我的随机的方法:PriapiWriteApiQpsConfig.apiList.get(getRandomIntZero(size.get()))

    这里可能有的小伙伴有个疑问,因为在这个线程执行的过程中,从list中随机的方法的QPS是非常高的。一定会有随机到100,但是刚好这个100的元素被移除这种情况。虽然我没有从现有资料中看到这个情况会get到null还是新的元素。但是据我自己的测试中,当随机方法在10万QPS的测试中,并没有发生。

    FunTester原创专题集锦

    阅读原文,跳转我的仓库地址

  • 相关阅读:
    [deviceone开发]-底部弹出选择
    [deviceone开发]-动态添加组件add方法的示例
    [deviceone开发]-openPage的动画效果示例
    [deviceone开发]-do_Album的简单示例
    [deviceone开发]-Star分享的几个示例
    [deviceone开发]-do_Webview的基本示例
    [deviceone开发]-do_Webview加载JQueryMobile的示例
    [deviceone开发]-心形点赞动画示例
    函数式编程思维学习 (1)
    android 14.04 64位 adb cannot run program adb
  • 原文地址:https://www.cnblogs.com/FunTester/p/16548003.html
Copyright © 2020-2023  润新知