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

用例的多线程运行

这里指的是批量运行测试用例,采用多线程运行,然后把结果汇总返回给前端展示。相比于之前的异步单线程运行方法,显然提高了不少,经过我的粗略测试,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';


热文精选


↙↙↙阅读原文可查看相关链接,并与作者交流