junit中的case和suite的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了junit中的case和suite的区别相关的知识,希望对你有一定的参考价值。

参考技术A :使用的是junit4.4,想要有选择性的执行TestCase中的Test,是需要自己扩展junit4.4的API的。junit4.8的版本中,加入了一个Runner:Categories,可以实现只跑特定分类的Test。现在通过代码举例来比较两个版本中批量执行Test的差别.本回答被提问者采纳

全网最全:Junit5的@Suite注解-上

Junit5Suite套件

最近在研究对应的suite套件,发现官网上有了对应的直接@Suite注解配合就可以使用套件,不需要再声明@RunWith(JUnitPlatform.class)
由于官网的解释不是很详细,在这里给大家写一篇比较详细的文章

  • 1)创建 maven 工程 XUnitpom.xml中添加Junit5Suite相关依赖
    pom.xml
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>11</java.version>
    <maven.compiler.version>3.3</maven.compiler.version>
    <maven.surefire.version>3.0.0-M5</maven.surefire.version>
    <junit.version>5.8.1</junit.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.junit</groupId>
            <artifactId>junit-bom</artifactId>
            <version>$junit.version</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>


    </dependencies>
</dependencyManagement>


<dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.junit.platform</groupId>
        <artifactId>junit-platform-suite</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>$maven.surefire.version</version>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>$maven.compiler.version</version>
            <configuration>
                <encoding>UTF-8</encoding>
                <source>$java.version</source>
                <target>$java.version</target>
            </configuration>
        </plugin>
    </plugins>
</build>

下面开始介绍对应套件执行的相关注解,如果项目是从Junit4进行迁移,那还是需要@RunWith(JUnitPlatform.class);如果是一个全新的junit5项目,建议直接使用@Suite注解进行,下面对应的所有注解进行一个示例

@Suite

注解作用
@Suite放在类上的注解;是Junit5平台的一个测试套件
@SelectClasses过滤出需要执行的测试类
@SelectPackages过滤出需要执行的测试包
@SuiteDisplayName自定义Suite套件的显示名称
@IncludePackages@SelectPackages搭配,过滤出需要执行的测试包
@SuiteDisplayName过滤出需要执行的个测试类
@SelectClasses过滤出需要执行的个测试类
@SelectClasses过滤出需要执行的个测试类
@SelectClasses过滤出需要执行的个测试类

测试类准备

com.packageA

OneTest

package com.packageA;

import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;

/**
 * @program: testpro
 * @author: 盖盖
 * @description:
 * @Version 1.0
 * @create: 2021/11/30 4:25 下午
 */
public class OneTest 

    @Test
    @Tag("SuiteTag")
    @Tag("SuiteTag1")
    void test1()
        System.out.println("com.class5.packageA-----OneTest");

    

TwoTest

package com.packageA;

import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;

/**
 * @program: testpro
 * @author: 盖盖
 * @description:
 * @Version 1.0
 * @create: 2021/11/30 4:25 下午
 */
public class TwoTest 

    @Test
    @Tag("SuiteTag")
    void test1()
        System.out.println("com.class5.packageA-----TwoTest");

    

com.packageB

OneTest

package com.packageB;

import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;

/**
 * @program: testpro
 * @author: 盖盖
 * @description:
 * @Version 1.0
 * @create: 2021/11/30 4:25 下午
 */
public class OneTest 

    @Test
    @Tag("SuiteTag")
    @Tag("SuiteTag1")
    void test1()
        System.out.println("com.class5.packageB-----OneTest");

    

TwoTest

package com.packageB;

import org.junit.jupiter.api.Test;

/**
 * @program: testpro
 * @author: 盖盖
 * @description:
 * @Version 1.0
 * @create: 2021/11/30 4:25 下午
 */
public class TwoTest 

    @Test
    void test1()
        System.out.println("com.class5.packageB-----TwoTest");

    


TreeTest

package com.packageB;

import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;

/**
 * @program: testpro
 * @author: 盖盖
 * @description:
 * @Version 1.0
 * @create: 2021/11/30 4:25 下午
 */
public class TreeTest 

    @Test
    @Tag("SuiteTag1")
    void test1()
        System.out.println("com.class5.packageB-----TreeTest1");

    

TestFour

package com.packageB;

import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;

/**
 * @program: testpro
 * @author: 盖盖
 * @description:
 * @Version 1.0
 * @create: 2021/12/1 4:00 下午
 */
public class TestFour 

    @Test
    @Tag("SuiteTag1")
    void test1()
        System.out.println("com.class5.packageB-----TestFour");

    

    @Test
    void test2()
        System.out.println("com.class5.packageB-----TestFour---test2");

    
    @Test
    void test3()
        System.out.println("com.class5.packageB-----TestFour---test3");

    
    @Test
    void test4()
        System.out.println("com.class5.packageB-----TestFour---test4");

    

测试套件组合

@Suite+@SelectClasses

过滤出需要执行的单个测试类

package class5.packageC;

import com.packageA.OneTest;
import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;

/**
 * @program: testpro
 * @author: 盖盖
 * @description: 过滤出需要执行的单个测试类
 * @Version 1.0
 * @create: 2021/11/30 1:54 下午
 */
@Suite
@SelectClasses(OneTest.class )
public class RunSuite01Test 

过滤出需要执行的多个测试类

package class5.packageC;

import com.packageA.OneTest;
import com.packageB.TwoTest;
import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;

/**
 * @program: testpro
 * @author: 盖盖
 * @description: 过滤出需要执行的多个测试类
 * @Version 1.0
 * @create: 2021/11/30 1:54 下午
 */
@Suite
@SelectClasses(
        OneTest.class,
        TwoTest.class
)
public class RunSuite02Test 

@Suite+@SelectPackages

过滤出需要执行的单个测试包

package class5.packageC;

import org.junit.platform.suite.api.SelectPackages;
import org.junit.platform.suite.api.Suite;
import org.junit.platform.suite.api.SuiteDisplayName;

/**
 * @program: testpro
 * @author: 盖盖
 * @description: 过滤出需要执行的测试包
 * @Version 1.0
 * @create: 2021/11/30 1:54 下午
 */
@Suite
@SuiteDisplayName("Test Suite")
@SelectPackages("com.packageA")
public class RunSuite03Test 

过滤出需要执行的多个测试包

package class5.packageC;

import org.junit.platform.suite.api.SelectPackages;
import org.junit.platform.suite.api.Suite;
import org.junit.platform.suite.api.SuiteDisplayName;

/**
 * @program: testpro
 * @author: 盖盖
 * @description: 过滤出需要执行的测试包
 * @Version 1.0
 * @create: 2021/11/30 1:54 下午
 */
@Suite
@SuiteDisplayName("Test Suite04")
@SelectPackages(
        "com.packageA",
        "com.packageB"
)
public class RunSuite04Test 

@Suite+@SuiteDisplayName+*

自定义Suite套件的显示名称

在上面对应用例中已经生效

@Suite+@SelectPackages+@IncludePackages

配合使用过滤出需要执行的测试包

package class5.packageC;

import org.junit.platform.suite.api.IncludePackages;
import org.junit.platform.suite.api.SelectPackages;
import org.junit.platform.suite.api.Suite;
import org.junit.platform.suite.api.SuiteDisplayName;

/**
 * @program: testpro
 * @author: 盖盖
 * @description: 配合使用过滤出需要执行的测试包
 * @Version 1.0
 * @create: 2021/11/30 1:54 下午
 */
@Suite
@SuiteDisplayName("Test Suite05")
@SelectPackages(
        "com"
)
@IncludePackages("com.packageB")
public class RunSuite05Test 

@Suite+@SelectPackages+@ExcludePackages

配合使用过滤出不需要执行的测试包

package class5.packageC;

import org.junit.platform.suite.api.ExcludePackages;
import org.junit.platform.suite.api.SelectPackages;
import org.junit.platform.suite.api.Suite;
import org.junit.platform.suite.api.SuiteDisplayName;

/**
 * @program: testpro
 * @author: 盖盖
 * @description: 配合使用过滤出不需要执行的测试包
 * @Version 1.0
 * @create: 2021/11/30 1:54 下午
 */
@Suite
@SuiteDisplayName("Test Suite06")
@SelectPackages(
        "com"
)
@ExcludePackages(
        "com.packageB"
)
public class RunSuite06Test 

@Suite+@SelectPackages+@IncludeClassNamePatterns

用正则匹配出来具体的class执行

package class5.packageC;

import org.junit.platform.suite.api.IncludeClassNamePatterns;
import org.junit.platform.suite.api.SelectPackages;
import org.junit.platform.suite.api.Suite;
import org.junit.platform.suite.api.SuiteDisplayName;

/**
 * @program: testpro
 * @author: 盖盖
 * @description: 用正则匹配出来具体的class执行
 * @Version 1.0
 * @create: 2021/11/30 1:54 下午
 */
@Suite
@SuiteDisplayName("Test Suite07")
@SelectPackages(
        "com"
)
@IncludeClassNamePatterns(
        "com.packageB.*Test"
//        "com.packageB.*"
)
public class RunSuite07Test 

@Suite+@SelectPackages+@IncludeClassNamePatterns

用正则匹配出来具体的class哪些不被执行

package class5.packageC;

import org.junit.platform.suite.api.*;

/**
 * @program: testpro
 * @author: 盖盖
 * @description: 用正则匹配出来具体的class哪些不被执行
 * @Version 1.0
 * @create: 2021/11/30 1:54 下午
 */
@Suite
@SuiteDisplayName("Test Suite08")
@SelectPackages(
        "com"
)
@ExcludeClassNamePatterns("com.packageB.*Test$")
public class RunSuite08Test 

@Suite+@SelectPackages+@IncludeTags

运行指定的包下的指定标签的方法

package class5.packageC;

import org.junit.platform.suite.api.IncludeTags;
import org.junit.platform.suite.api.SelectPackages;
import org.junit.platform.suite.api.Suite;
import org.junit.platform.suite.api.SuiteDisplayName;

/**
 * @program: testpro
 * @author: 盖盖
 * @description: 
 * @Version 1.0
 * @create: 2021/11/30 1:54 下午
 */
@Suite
@SuiteDisplayName("Test Suite Tag")
@SelectPackages(
        "com"
)
@IncludeTags(
//        "SuiteTag"
        "SuiteTag1"
)
public class RunSuite09Test 

@Suite+@SelectPackages+@ExcludeTags

运行指定的包下并且不包含指定标签的方法

package class5.packageC;

import org.junit.platform.suite.api.*;

/**
 * @program: testpro
 * @author: 盖盖
 * @description: 
 * @Version 1.0
 * @create: 2021/11/30 1:54 下午
 */
@Suite
@SuiteDisplayName("Test Suite")
@SelectPackages(
        "com"
)
@ExcludeTags(
        "SuiteTag1"
)
public class RunSuite10Test 

以上是关于junit中的case和suite的区别的主要内容,如果未能解决你的问题,请参考以下文章

如何解析JUnit结果xml文件并在java代码中获取testcase?

gtest从一无所知到熟练使用什么是test suite和test case

Junit4 Suite.SuiteClasses升级 junit5

Junit介绍以及shi

全网最全:Junit5的@Suite注解-上

带有 @Suite 注释的 Junit5 测试套件不使用 mvn test 命令执行测试