• 0
  • 0
分享
  • 单元测试运行慢?十分钟教会你怎么提升单测运行速度——软件测试圈
  • 曼倩诙谐 2023-07-18 16:04:43 字数 2707 阅读 1223 收藏 0

  背景

  单元测试是项目研发的重要阶段。相比接口测试、界面测试,单元测试外部依赖最少、颗粒度最细,可以在开发阶段更快、更直接地发现Bug,适合开发团队快速排查错误,是保障研发质量的重要手段之一。

  但是,随着单元测试用例数量的增加,执行速度也会逐渐变长。我们经常看到一个现象:在研发人员的研发终端上,运行数千条单元测试脚本,时间超过1个小时。

  本文主要是总结了笔者近年来的单元测试经验,分享如何有效提升单元测试的运行速度,节约开发时间。

  提升妙招

  1、优化单元测试代码

  例如:

    @Test
    public void test1() {
        //模拟数据库交互
        List mockList = Mockito.mock(List.class);
        when(mockList.get(0)).thenReturn("first");
        assertThat(mockList.get(0)).isEqualTo("first");
}
    @Test
    public void test2() {
        //模拟第三方接口返回
        when(personService.queryForOneName("1")).thenReturn("ceshiname1");       assertThat(personService.queryForOneName("1")).isEqualTo("ceshiname1");
}

  2、多模块项目并行编译

  针对多模块项目推荐采用mvn命令加-T选项开启并行构建。例如:mvn -T 2 test(指定两个线程并行),mvn -T 2C test(指定每个CPU分配2个线程构建)。

  3、并发执行单元测试脚本

  在maven-surefire-plugin开启parallel,可以为一个进程开启多个线程(Junit高于4.7)。

  使用threadCount参数可以设置创建的最大线程数,或使用useUnlimitedThreads参数,可以为每个CPU内核创建一个线程。例如:

     <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.18.1</version>
          <configuration>
               <skipTests>false</skipTests>
               <testFailureIgnore>true</testFailureIgnore>
               <argLine>${argLine} -XX:MaxPermSize=1024m</argLine>
               <parallel>all</parallel>
               <threadCount>4</threadCount>
          </configuration>
     </plugin>

  4、执行参数优先使用mvn test

  mvn clean package依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)等7个步骤。

  mvn clean install依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install等8个步骤。

  mvn test命令可以一次性执行所有的用例,执行完后可以直接看到执行结果,相对mvn clean package和mvn clean install更节省时间。

  5、减少初始化次数

  使用suite参数,将同一个类的测试用例放在一个suite套件中,执行时只初始化一遍,减少初始化次数。

  另外,推荐直接使用SpringBootTest注解,避免在注解中加入一些选项值,导致注解加载多次,延长时间。例如:

@Slf4j
@SpringBootTest
@RunWith(SpringRunner.class)
public class CaseServiceImplTest {
    @Autowired
    private CaseService caseService;
    @Test
    public void countCaseByUsername() {
        String userName = "xxxx";
        ResultBus resultBus = caseService.countByUsername(userName);
        org.junit.Assert.assertNotNull(resultBus);
        Assert.assertEquals(resultBus.getMessage(), resultBus.getCode(), CodeInfoEnum.SUCCESS.code());
        System.out.println(resultBus);
    }
}

  6、优化执行慢的测试用例

  本地执行过程中控制台输出每个用例的执行时间,将结果保存在日志中,按照执行时间进行排序(例如cat log.txt|grep “Time elapsed:”|sort -t’’-k 13rn, 13| head -15)。

  通过日志,查看耗时较长的用例,有针对性地进行优化。

  7、扩充执行资源

  增加执行终端的CPU、内存,或者选择配置更高的执行终端运行,缩短单元测试执行时间。

  结语

  提高单元测试运行速度对提升研发效率具有重要的意义,也是单元测试领域的一个重要研究课题。笔者也将在该领域不断加强研究,不断总结好的方法,与大家共同致力于单元测试运行速度的提升。

  测试进阶

  在智能驾驶发展得如火如荼的今天,软件测试行业也随之衍生出车载测试的岗位需求。对比其它在招岗位,车载测试的薪资也更加可观。


作者:51Testing    

来源:http://www.51testing.com/html/29/n-7796229.html

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 1、添加线程组--在测试计划上右击-添加-Threads-线程组线程数:登录用户人数Ramp-up Period:5s内5个人完成登录,隔一秒就开始登录下一个人循环测试:可以设定请求次数,此处是5个人循环两次,发送10个http请求2、添加http请求默认值--在线程组上右击-添加-配置元器件-http请求默认值这是下边sampler相同信息的集合,添加http请求默认值之后,sampler中此项信息可以空白,jmeter执行时会自动获取3、添加sampler-http请求-登录界面4、添加sampler-http请求-登录-携带用户名和密码可以看到-登录界面和登录携带参数的请求网址是不一样的...
            14 14 2298
            分享
          • 评价人工智能算法模型的几个重要指标如何测试人工智能产品越来越受到广大测试工程师的关注,由于人工智能的测试预言(Test Oracle)不是像普通软件产品那么明确,到目前为止,基于大数据的第四代人工智能产品的测试,主要集中在“对大数据测试”“白盒测试”“基于样本分析算法的优劣”以及“对最终产品的验收测试”。“对大数据测试”主要针对数据阶段验证、对数据计算验证和对输出阶段验证;“白盒测试”主要考虑神经元覆盖(Neuron Coverage)、阈值覆盖率(Threshold Coverage)、符号变更率(Sign Change Coverage)、值变更覆盖率(Value Change ...
            0 1 2867
            分享
          •   AREX 是一款开源的基于真实请求与数据的自动化回归测试平台(项目地址:https://github.com/arextest),利用 Java Agent 技术与比对技术,通过流量录制回放能力实现快速有效的回归测试。同时提供了接口测试、接口比对测试等丰富的自动化测试功能,无需编程能力也可快速上手。  在使用 AREX 流量录制功能时,AREX Java?Agent 会记录生产环境中 Java 应用的数据流量和请求信息,并将这些信息发送给 AREX 数据存取服务(Storage Service),由数据存取服务导入 Mongodb 数据库中进行存储。...
            0 0 2084
            分享
          • 一、大数据:大数据是一个大的数据集合,通过传统的计算技术无法进行处理。这些数据集的测试需要用各种工具、技术、框架进行处理。大数据涉及数据创建,存储、检索、分析,而且它在数量、多样性、速度方面都很出色。二、大数据的测试类型:验证其数据处理、性能和功能测试是关键;处理:批量、实时、交互;数据质量测试:字段一致性、准确性、重复性、有效性、数据完整性性能测试。三、大数据的测试步骤:step1:数据阶段验证:pre-Hadoop阶段,数据预测试阶段来自各方面的数据资源应该被验证,来确保正确的数据被加载进系统;将源数据与推送到Hadoop系统中数据进行比较,确保他们匹配;验证正确的数据被提取并加载到HDF...
            15 15 1076
            分享
          •   想换工作的小伙伴们对于怎么投简历有什么想法?作为一个曾经在外包公司干了一整年的recruiter,作为走遍外包私企外企国企的测试人,作为换了7次工作的测试开发工程师,作为参加了无数面试且面试了无数人的小姐姐,我来跟大家聊点干货。  工作这个东西吧,除了养家糊口,还是需要一定的兴趣和热情的。首先要知道自己想干什么,然后是能干什么,最后才是怎么干。  TIPS:不喜欢的不要投,万一拿到offer那就是头疼的事情;自己用业余时间努力学习仍然干不了的不要投,很有可能过不了试用期,对简历不好。  想写代码的,直接去投开发岗就好,不要因为测试工作好找,先做测试以后转开发。市面上能转岗的公司不多,说可以...
            0 0 1285
            分享
      • 51testing软件测试圈微信