• 我的开发日记(十三)


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

    用例的多线程运行

    这里指的是批量运行测试用例,采用多线程运行,然后把结果汇总返回给前端展示。相比于之前的异步单线程运行方法,显然提高了不少,经过我的粗略测试,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首发,更多原创文章:FunTester420+原创文章,欢迎关注、交流,禁止第三方擅自转载。

    热文精选

  • 相关阅读:
    my first blog
    CentOS启动报错:Centos kernel panic-not syncing:VFS:Unable to mount root fs on unknown block
    J2EE在Web容器中启动报错:com.sun.jdi.InvocationException occurred invoking method.
    SVN报错:can't open file db/txn-current-lock:permission denied 解决方法
    Linux(CentOS6.4、CentOS6.3)下安装、配置PostgreSQL9.2
    [模板] 线性代数:矩阵/高斯消元/矩阵求逆/行列式
    [模板] 杂项:二分/离散化/随机数/其他
    [模板] 图论:存储/拓扑排序
    Luogu1137 旅行计划(拓扑排序)
    C++模板、.vimrc和一些Linux配置
  • 原文地址:https://www.cnblogs.com/FunTester/p/13277617.html
Copyright © 2020-2023  润新知