如何对单行多次update接口进行压测

update某一个字段值和原来值相同时性能比不同时更高。

在对服务端进行测试的时候,经常会遇到这类情况:单个接口的功能就是修改数据库中某一条数据某个字段的值。在对这类接口进行压测的过程中,遇到一个难点,如何每次都设置不同的值,当然可以通过获取一类的随机数的形式规避掉重复的概率,但是在特定场景下依然无法解决,比如字段值范围偏小。

在工作中遇到一个典型的案例就是对于用户性别的修改,用户性别属性在数据库中以0-3的数字表示无,男,女,保密。在接口参数中也只有四个选择变量值。

这这种情况下,使用刚才的方案采取随机数的情况就难以实现,因为重复的概率很大。

下面是我当时采取的测试方案(仅供参考):

并发策略依然采用之前的方案:一个线程绑定一个用户,不断发起请求。

解决传参重复:每个线程绑定一个integer类对象,然后每次把对象的值当做性别的值放到请求参数里面去。完成请求之后,执行“++”操作,然后再执行对4取模然后赋值本身。伪代码如下:

1int i;
2//循环开始
3doRequest(i);
4i++;
5i=i%4;
6//循环结束
7//单线程执行完成

通过这样的方法即可解决请求参数可能跟原有值重复问题,如果还需要对每一次结果进行验证,可继续在接口方法中进行拓展。
下面是我用Java写的一个demo,如果是Groovy写脚本的话会更简单一些。

 1package com.fun;
 2
 3import com.fun.base.constaint.ThreadBase;
 4import com.fun.frame.SourceCode;
 5import com.fun.frame.excute.Concurrent;
 6import com.fun.frame.httpclient.FanLibrary;
 7
 8import java.util.ArrayList;
 9import java.util.List;
10
11public class G extends SourceCode {
12
13    public static void main(String[] args) {
14        int threadNum = 100;
15        int times = 1000;
16        List<ThreadBase> threadTask = new ArrayList<>();
17        for (int i = 0; i < threadNum; i++) {
18            ThreadBase<Integer> threadBase = new ThreadBase<Integer>(i, times) {
19                User user;
20
21                @Override
22                protected void before() {
23                    user = new User(t);
24                }
25
26                @Override
27                protected void doing() throws Exception {
28                    user.doRequest(t++);
29//                    user.check();//校验
30                    t = t % 4;
31                }
32
33                @Override
34                protected void after() {
35
36                }
37            };
38            threadTask.add(threadBase);
39        }
40        Concurrent concurrent = new Concurrent(threadTask);
41        concurrent.start();
42        FanLibrary.testOver();
43    }
44
45
46}
47
48class User {
49
50    public User(int i) {
51
52    }
53
54    public void doRequest(int i) {
55        System.out.println("完成!" + i);
56    }
57
58    public boolean check() {
59        return true;
60    }
61}

然后脚本写完之后还可以通过把线程数和请求数进行参数化来让使用更加灵活。

技术类文章精选

非技术文章精选

大咖风采

 

然后脚本写完之后还可以通过把线程数和请求数进行参数化来让使用更加灵活。

技术类文章精选

非技术文章精选

大咖风采

posted @   小强找BUG  阅读(569)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2018-10-26 MYSQL性能优化之Mysql数据库监控
2018-10-26 Linux定时清理30天前的Tomcat日志脚本
2018-10-26 使用shell巧妙高效的批量删除历史文件或目录
2018-10-26 linux shell 脚本 历史文件清理脚本,按天,按月,清理前N天的历史文件,删除指定大小历史文件,历史文件归档清理
2018-10-26 Linux打包压缩
2018-10-26 Linux文件查找
点击右上角即可分享
微信分享提示