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

一、前言

  • 最近测试一个开源项目,发现生成的 全局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. 使用

public class UniqueIdGeneratorTest {
    private Set<Long> ids = new ConcurrentHashSet<>(128);

    @org.testng.annotations.Test(invocationCount = 128, threadPoolSize = 3)
    public void testGenerateId() {
        final Long id = UniqueIdGenerator.generateId();
        assertTrue(ids.add(id), "id exists," + id);
    }

}

3. 效果

testng.png

三、Junit5

1. 安装

  • 选择 使用数 比较多、也比较新 的版本,5.8.2。<junit-jupiter.version>5.8.2</junit-jupiter.version>
  • 最好通过 dependencyManagement 来统一版本,尤其是 多模块项目
  • 建议放到 spring-boot-dependencies 前面,优先级更高
    <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. 使用

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. 效果

junit5.png

四、总结

本文遵守【CC BY-NC】协议,转载请保留原文出处及本版权声明,否则将追究法律责任。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,295评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,928评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,682评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,209评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,237评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,965评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,586评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,487评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,016评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,136评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,271评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,948评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,619评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,139评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,252评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,598评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,267评论 2 358

推荐阅读更多精彩内容

  • Junit5测试框架 一、Junit5框架构成 与以前的 JUnit 版本不同,JUnit 5 由来自三个不同子项...
    羋学僧阅读 430评论 0 1
  • 概述 编写的测试代码就是 Java 代码 运行要遵守 Java 的语法和 JVM 的规定 测试类型 手工测试 单元...
    bowen_wu阅读 230评论 0 0
  • 关于JUnit5,前辈们的文章写的都很好,比如:一篇教你学会Junit5[https://zhuanlan.zhi...
    伊丽莎白2015阅读 884评论 0 0
  • JUnit 5 作为新一代的 Java 单元测试框架,提供很多改进。例如对比 JUnit4 与 JUnit5 的官...
    MrTT阅读 12,516评论 0 7
  • 一、概念 JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vin...
    一只夜猫子阅读 1,221评论 0 0