Testng和Junit5多线程并发测试对比

javalover123
• 阅读 396

一、前言

  • 最近测试一个开源项目,发现生成的 全局id 有重复,也没有单元测试,就准备贡献个 PR
  • 想到多线程并发测试,根据经验,第一想法是用 Testng,后面看了下 Junit5 也有实验性支持了,就对比下(以 maven 为例)
  • spock 不太适合这种场景

二、Testng

1. 安装

  • 选择 使用数 比较多、也比较新 的版本,7.7.1。<testng.version>7.7.1</testng.version>
  • 多模块项目,可以在 根pom.xml里面添加依赖,避免每个模块都增加配置哦
      <dependencies>
          <!-- test -->
          <dependency>
              <groupId>org.junit.jupiter</groupId>
              <artifactId>junit-jupiter</artifactId>
              <scope>test</scope>
          </dependency>
      </dependencies>

2. 使用

}


### 3. 效果
![testng.png](https://img-hello-world.oss-cn-beijing.aliyuncs.com/96578aa82de7885ab4a1419961296038.png)

## 三、[Junit5](https://junit.org/junit5/docs/current/user-guide/#writing-tests-parallel-execution)
### 1. 安装
- 选择 使用数 比较多、也比较新 的版本,5.8.2。<junit-jupiter.version>5.8.2</junit-jupiter.version>
- 最好通过 dependencyManagement 来统一版本,尤其是 多模块项目
- 建议放到 spring-boot-dependencies 前面,优先级更高
```xml
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.junit</groupId>
                <artifactId>junit-bom</artifactId>
                <version>${junit-jupiter.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>    </dependencyManagement>

多模块项目,可以在 根pom.xml里面添加依赖,避免每个模块都增加配置哦

    <dependencies>
        <!-- test -->
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>${testng.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

2 配置项

3 配置方式

  • System properties 配置方式,更适合多模块项目(根pom.xml配置,子模块就不用配置了)

              <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-surefire-plugin</artifactId>
                  <version>2.18.1</version>
                  <configuration>
                      <argLine>-Djunit.jupiter.execution.parallel.enabled=true -Djunit.jupiter.execution.parallel.config.strategy=fixed
                          -Djunit.jupiter.execution.parallel.config.fixed.parallelism=3 -Djunit.jupiter.execution.parallel.config.fixed.max-pool-size=3
                      </argLine>
                  </configuration>
              </plugin>
  • 配置文件 test/resources 目录下,增加 junit-platform.properties 文件,内容如下:

    #是否允许并行执行true/false
    junit.jupiter.execution.parallel.enabled=true
    #是否支持方法级别多线程same_thread/concurrent
    junit.jupiter.execution.parallel.mode.default=concurrent
    #是否支持类级别多线程same_thread/concurrent
    junit.jupiter.execution.parallel.mode.classes.default=concurrent
    # the maximum pool size can be configured using a ParallelExecutionConfigurationStrategy
    junit.jupiter.execution.parallel.config.strategy=fixed
    junit.jupiter.execution.parallel.config.fixed.parallelism=3
    junit.jupiter.execution.parallel.config.fixed.max-pool-size=3

4. 使用

  • 需改为 @RepeatedTest,和 普通测试不一致,并发线程数 是全局的

  • 测试对象 不同,ids属性 需加 static

    class UniqueIdGeneratorTest2 {
      private static Set<Long> ids = new ConcurrentHashSet<>(128);
    
      @org.junit.jupiter.api.RepeatedTest(128)
      @org.junit.jupiter.api.parallel.Execution(ExecutionMode.CONCURRENT)
      void generateId() {
          final Long id = UniqueIdGenerator.generateId();
          assertTrue(ids.add(id), "id exists," + id);
      }
    }

5. 效果

Testng和Junit5多线程并发测试对比

四、总结

本文遵守【CC BY-NC】协议,转载请保留原文出处及本版权声明,否则将追究法律责任。
本文首先发布于 https://www.890808.xyz/ ,其他平台需要审核更新慢一些。

Testng和Junit5多线程并发测试对比

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java junit框架的windows自动化
  在京东混了一个月,基本有点稳定了,觉得也有所余力了现在,继续写博客吧,不过以后更新也许不是那么频繁了  本人使用的是junit框架,对开发是一个单元测试的java框架,但是对测试而言是java的基石之一,与testng差不多平分秋色(好吧,其实是稍微差一点)在上文http://www.cnblogs.com/xuezhezlr/p/77736
凯文86 凯文86
3年前
Spring Boot API 服务测试指南
SpringBoot除了简化了Spring应用的开发,同时也简化了Spring应用的测试。它内置支持各种常用测试工具,包括SpringTest、JUnit、TestNG、Mockito、AssertJ等。本文将讲解如何编写单元测试和集成测试来保障SpringBootAPI应用不同层级代码的质量,其中会涉及到使用嵌入式的H2数据库
Easter79 Easter79
3年前
Testng Retry失败用例重新运行的方法(一)
Testng是Java自动化测试的一个框架,它提供了一个对失败用例重新执行的监听器,即接口IRetryAnalyzer。先准备一个测试类:importorg.testng.annotations.Test;importstaticorg.testng.Assert.assertTrue;pu
Easter79 Easter79
3年前
TestNG+Selenium
是一个开源自动化测试框架。其实类似于JUnit这种单元测试框架,但进行了一些功能扩展属于selenium?还是说TestNG是一个测试框架,它用到了selenium的web自动化测试的功能,比如使用浏览器对应的driver去进行操作,不一定要由RobotFramework触发参考TestNG环境设置(
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
JUnit
一、会用Spring测试套件的好处在开发基于Spring的应用时,如果你还直接使用Junit进行单元测试,那你就错过了Spring为我们所提供的饕餮大餐了。使用Junit直接进行单元测试有以下四大不足:1)导致多次Spring容器初始化问题根据JUnit测试方法的调用流程,每执行一个测试方法都会创建一个测试用例的实例并调用setUp()方法。由于
javalover123 javalover123
1年前
Java代码性能测试实战之ContiPerf
最近测试一个开源项目,发现生成的全局id有重复,方法加上synchronized提交PR后,有些同行对性能有疑虑,就准备做个代码性能测试。Java基准性能测试一般用JMH比较多,但是官方建议性能测试单独一个项目,感觉麻烦了点。发现ContiPerf可以方便的设置执行次数、时长、线程数、预热时长,还有Html格式报告,感觉还比较适合,基于Junit
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了
死牛胖子 死牛胖子
4个月前
Maven配置跳过单元测试
Maven构建时,如果项目中写了测试用例,则会执行单元测试,这会导致构建过程非常漫长,如果测试失败,还会中止构建,所以构建时更多选择跳过单元测试阶段。
javalover123
javalover123
Lv1
10年Java经验,多个开源项目贡献者。https://github.com/javalover123
文章
16
粉丝
2
获赞
5