update 某一个字段值和原来值相同时性能比不同时更高。
在对服务端进行测试的时候,经常会遇到这类情况:单个接口的功能就是修改数据库中某一条数据某个字段的值。在对这类接口进行压测的过程中,遇到一个难点,如何每次都设置不同的值,当然可以通过获取一类的随机数的形式规避掉重复的概率,但是在特定场景下依然无法解决,比如字段值范围偏小。
在工作中遇到一个典型的案例就是对于用户性别的修改,用户性别属性在数据库中以 0-3 的数字表示无,男,女,保密。在接口参数中也只有四个选择变量值。
这这种情况下,使用刚才的方案采取随机数的情况就难以实现,因为重复的概率很大。
下面是我当时采取的测试方案(仅供参考):
并发策略依然采用之前的方案:一个线程绑定一个用户,不断发起请求。
解决传参重复:每个线程绑定一个 integer 类对象,然后每次把对象的值当做性别的值放到请求参数里面去。完成请求之后,执行 “++” 操作,然后再执行对 4 取模然后赋值本身。伪代码如下:
int i;
//循环开始
doRequest(i);
i++;
i=i%4;
//循环结束
//单线程执行完成
通过这样的方法即可解决请求参数可能跟原有值重复问题,如果还需要对每一次结果进行验证,可继续在接口方法中进行拓展。
下面是我用 Java 写的一个 demo,如果是 Groovy 写脚本的话会更简单一些。
package com.fun;
import com.fun.base.constaint.ThreadBase;
import com.fun.frame.SourceCode;
import com.fun.frame.excute.Concurrent;
import com.fun.frame.httpclient.FanLibrary;
import java.util.ArrayList;
import java.util.List;
public class G extends SourceCode {
public static void main(String[] args) {
int threadNum = 100;
int times = 1000;
List<ThreadBase> threadTask = new ArrayList<>();
for (int i = 0; i < threadNum; i++) {
ThreadBase<Integer> threadBase = new ThreadBase<Integer>(i, times) {
User user;
@Override
protected void before() {
user = new User(t);
}
@Override
protected void doing() throws Exception {
user.doRequest(t++);
// user.check();//校验
t = t % 4;
}
@Override
protected void after() {
}
};
threadTask.add(threadBase);
}
Concurrent concurrent = new Concurrent(threadTask);
concurrent.start();
FanLibrary.testOver();
}
}
class User {
public User(int i) {
}
public void doRequest(int i) {
System.out.println("完成!" + i);
}
public boolean check() {
return true;
}
}
然后脚本写完之后还可以通过把线程数和请求数进行参数化来让使用更加灵活。