最近一直在忙着调试,本以为调试没多大事儿,最后才发现不到上线事情真就少不了。上了线事情估计更多了,第一次体验从需求阶段到开发上线的流程,感触还是颇多的。今天继续分享自己的两点感受:一是用例的多线程运行;二是数据库规范。

用例的多线程运行

这里指的是批量运行测试用例,采用多线程运行,然后把结果汇总返回给前端展示。相比于之前的异步单线程运行方法,显然提高了不少,经过我的粗略测试,40个接口测试用例最长2s搞定,快的话700ms,对于前段展示来讲,基本无感知。

其中涉及到关联测试用户的问题,多线程锁的设计,我之前文章写过了,可以翻看一下:我的开发日记(三)。

我的开发日记(十三)_用例

下面放一下自己的用例运行的多线程类:

package com.okay.family.common;

import com.okay.family.common.basedata.OkayConstant;
import com.okay.family.common.bean.testcase.CaseRunRecord;
import com.okay.family.common.bean.testcase.request.CaseDataBean;
import com.okay.family.common.enums.RunResult;
import com.okay.family.utils.RunCaseUtil;

import java.util.concurrent.CountDownLatch;

public class CaseRunThread implements Runnable {

CaseDataBean bean;

CaseRunRecord record;

CountDownLatch countDownLatch;

public CaseRunRecord getRecord() {
return record;
}

private CaseRunThread() {

}

public CaseRunThread(CaseDataBean bean, CountDownLatch countDownLatch, int runId) {
this.bean = bean;
this.countDownLatch = countDownLatch;
this.record = new CaseRunRecord();
record.setRunId(runId);
record.setUid(bean.getUid());
record.setParams(bean.getParams());
record.setCaseId(bean.getId());
record.setMark(OkayConstant.RUN_MARK.getAndIncrement());
bean.getHeaders().put(OkayConstant.MARK_HEADER, record.getMark());
record.setHeaders(bean.getHeaders());
}

@Override
public void run() {
try {
RunCaseUtil.run(bean, record);
} catch (Exception e) {
record.setResult(RunResult.UNRUN.getCode());
} finally {
countDownLatch.countDown();
}
}


}

线程池实现,这个比较简单,具体的参数我也在摸索当中,由于分配的硬件资源有限,具体配置多少还有待实际运用中找到答案。内容如下:

package com.okay.family.common;

import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class OkayThreadPool {

private static ThreadPoolExecutor executor = createPool();

public static void addSyncWork(Runnable runnable) {
executor.execute(runnable);
}

private static ThreadPoolExecutor createPool() {
return new ThreadPoolExecutor(5, 50, 10, TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>(1000));

}

}

数据库规范

目前使用​​MySQL​​​数据库,不做开发真不知道规范这么多,各种关键字不让用,命名规范和注释规范,特别是字段设计,编码格式一般统一,然后​​自增ID​​​的设置,最坑的还算是所有字段不能为​​null​​​,一下子改出来N个​​BUG​​,改了一天。

发一下自己的提测的​​SQL​​语句部分内容:

CREATE TABLE `qa_case_available_status` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
`name` varchar(8) NOT NULL COMMENT '名称',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='测试用例可用状态对照表-QA-FunTester-20200709';

INSERT INTO `qa_case_available_status` (id,name) VALUES (1, '可用');
INSERT INTO `qa_case_available_status` (id,name) VALUES (2, '不可用');


CREATE TABLE `qa_case_collection` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
`uid` int(10) NOT NULL COMMENT '创建者ID',
`envId` int(10) NOT NULL COMMENT '环境ID',
`name` varchar(64) NOT NULL DEFAULT '' COMMENT '用例集名称',
`pub` int(10) NOT NULL DEFAULT '0' COMMENT '共享状态',
`editor` int(10) NOT NULL COMMENT '最后编辑者ID',
`state` int(10) NOT NULL DEFAULT '1' COMMENT '最后运行状态',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_name` (`envId`, `name`)
) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8 COMMENT = '测试用例集-QA-FunTester-20200709';
  • 调试延期了两天,提测还算顺利,明天正式进入测试阶段,好像还得我自己做接口测试,另外一个同事负责​​Web​​测试,然后上线推广使用。

  • 公众号FunTester ,欢迎关注、交流,禁止第三方擅自转载。