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
    • 数据库配置优化
      • 运维去处理
  • 数据问题
    • 学员资格数据不对
      • 品牌
      • 校区
    • 预存数据不对
      • 一分钱导致
    • 合同配置问题

4、总结

性能测试是一个系统工程,由于自身也不是专业的测试。只能从研发的角度去从全量数据的层面去覆盖,同时也模拟以下并发的情况。若是想要全链路的去做性能测试。需要准备更多的准备, 最好是专人专岗去做,或者是专门请教专业的团队,然后再基于现在的业务,做主相对合理的技术方案。