非正规集成+压力测试
Contents
非正规集成测试和性能测试
6月份公司最重要的续费活动就要开始了,期间功能方面的改动不是特别大。但需要做性能测试和全部数据方面的验证。 基于以上(全部数据的验证、性能测试)目的,于是需要对接口进行性能测试。
1、工具调研
在工具调研方面,市面上常见的性能测试工具有以下。
- JMeter
- Apache Bench
- TestNG
- LoadRunner
基于熟悉上手和对公司业务数据的了解程度,最后选择了TestNG。原因有:
- 编码方便,灵活
- 数据驱动方式还不错
- 灵活的设置线程数
- 基于TestNG可以很灵活的设计一样宽表来保存结果集。
- 最后设计的表结构如下
create table renewalintegrationtesting.t_2023_renewal_list
(
id bigint auto_increment
primary key,
student_num varchar(128) null,
student_id varchar(36) null,
phone varchar(255) null,
customer_id varchar(500) null,
app_token varchar(255) null,
authorization varchar(255) null,
step1_url varchar(500) null comment '步骤一的接口地址',
step1_request text null,
step1_response text null,
step1_success tinyint default 0 not null comment '步骤一执行结果0-不成功1-成功',
step2_url varchar(500) null comment '步骤二的接口地址',
step2_request text null,
step2_response text null,
step2_success tinyint default 0 not null comment '步骤二执行结果0-不成功1-成功',
step3_url varchar(500) null comment '步骤3的接口地址',
step3_request text null,
step3_response text null,
step3_success tinyint default 0 not null comment '步骤3执行结果0-不成功1-成功',
step4_url varchar(500) null comment '步骤4的接口地址',
step4_request text null,
step4_response text null,
step4_success tinyint default 0 not null comment '步骤4执行结果0-不成功1-成功',
step5_url varchar(500) null comment '步骤5的接口地址',
step5_request text null,
step5_response text null,
step5_success tinyint default 0 not null comment '步骤5执行结果0-不成功1-成功',
step6_url varchar(500) null comment '步骤6的接口地址',
step6_request text null,
step6_response text null,
step6_success tinyint default 0 not null comment '步骤6执行结果0-不成功1-成功',
step7_url varchar(500) null comment '步骤7的接口地址',
step7_request text null,
step7_response text null,
step7_success tinyint default 0 not null comment '步骤7执行结果0-不成功1-成功',
step8_url varchar(500) null comment '步骤8的接口地址',
step8_request text null,
step8_response text null,
step8_success tinyint default 0 not null comment '步骤8执行结果0-不成功1-成功',
step9_url varchar(500) null comment '步骤9的接口地址',
step9_request text null,
step9_response text null,
step9_success tinyint default 0 not null comment '步骤9执行结果0-不成功1-成功',
step10_url varchar(500) null comment '步骤10的接口地址',
step10_request text null,
step10_response text null,
step10_success tinyint default 0 not null comment '步骤10执行结果0-不成功1-成功'
);
2、测试用例的编写
示例测试用例代码如查看订单列表
@DataProvider(name = "orderList", parallel = true)
public Object[][] orderList() throws Exception {
List<Entity> result = new ArrayList<>();
result = Db
.use(RENEWAL_INTEGRATION_TESTING)
.query("select * from " + TABLE_RENEWAL_LIST + " where step6_success = 1 and step7_success = 0");
Object[][] files = new Object[result.size()][];
for (int i = 0; i < result.size(); i++) {
files[i] = new Object[]{result.get(i)};
}
return files;
}
@Test(priority = 7, dataProvider = "orderList",,invocationCount = 1,threadPoolSize = 100)
public void step_7_orderList(Entity entity) throws Exception {
String authorization = entity.getStr("authorization");
String appToken = entity.getStr("app_token");
String url1 = RENEWAL_ONE + "/mp/order/list";
String customerId = entity.getStr("customer_id");
JSONObject requestObj = new JSONObject();
requestObj.put("customerId",customerId);
requestObj.put("pageNum",1);
requestObj.put("pageSize",100);
requestObj.put("status","");
HttpResponse<String> response = Unirest.post(url1)
.body(JSON.toJSONString(requestObj))
.header("apptoken", appToken)
.header("authorization",authorization)
.header("cache-control", "no-cache")
.contentType("application/json")
.asString();
Entity where = Entity.create(TABLE_RENEWAL_LIST).set("id", entity.getInt("id"));
String body = response.getBody();
if (response.getStatus() != 200) {
entity.set("step7_success", 0);
} else {
entity.set("step7_success", 1);
}
entity.set("step7_url",url1);
entity.set("step7_response",body);
entity.set("step7_request",JSON.toJSONString(requestObj));
int update = 0;
try {
update = Db
.use(RENEWAL_INTEGRATION_TESTING)
.update(entity, where);
} catch (SQLException e) {
e.printStackTrace();
}
}
3、小黑屋(会议室)集体做性能
花了接近2天的时间一起集中测试把用例跑完了,其过程中发现的问题有:
- 环境准备的问题
- 内部链接灰度的配置,4台机器启动
- 3台机器同时,每台机器40个线程同时进行
- 程序优化问题
- 配置优化
- feign
超时重试次数
配置,有1
次调整为0
次
- feign
- 数据库配置优化
- 运维去处理
- 配置优化
- 数据问题
- 学员资格数据不对
- 品牌
- 校区
- 预存数据不对
- 一分钱导致
- 合同配置问题
- 学员资格数据不对
4、总结
性能测试是一个系统工程,由于自身也不是专业的测试。只能从研发的角度去从全量数据的层面去覆盖,同时也模拟以下并发的情况。若是想要全链路的去做性能测试。需要准备更多的准备, 最好是专人专岗去做,或者是专门请教专业的团队,然后再基于现在的业务,做主相对合理的技术方案。