Skip to content

Junit5标记测试用例

JUnit5 标记测试用例

在软件测试中,标记测试用例是指为测试用例添加特定的标记或标签,以便更有效地组织和管理测试用例。

使用场景

  1. 优先级管理:通过为测试用例添加优先级标记,可以区分哪些测试用例是高优先级的,需要在首要测试阶段执行,哪些是低优先级的,可以在后续测试阶段执行。

  2. 功能分类:对于复杂的系统,可以使用标记将测试用例按功能进行分类,例如登录功能、注册功能、支付功能等。这使得可以更快地找到特定功能的相关测试用例。

  3. 缺陷修复确认:在进行缺陷修复后,可以为相应的测试用例添加一个标记,以确认修复是否成功。这有助于确保缺陷得到及时修复,避免反复出现。

  4. 冒烟测试:冒烟测试是一种快速验证系统的基本功能是否正常的测试方法。通过为冒烟测试用例添加一个特定的标记,可以轻松地执行只包含冒烟测试用例的测试套件,以保证系统的基本可用性。

  5. 版本控制:在进行版本迭代或发布时,可以使用标记来跟踪每个版本中的测试用例。这有助于确保每个版本都有相应的测试用例,以进行全面测试。

使用Tag 标记用例步骤

  • 设置标签
  • 根据标签执行 - 结合 Maven 执行 - 结合测试套件执行

1. 设置标签

  • 使用@Tag注解为测试用例设置标签,这里需要注意标签名的命名规范。
        @Tag("标签名")
    
Tags 的命名规范
  • 不准为空。
  • 标签不得包含空格。
  • 标签不得包含 ISO 控制字符。
  • 标签不得包含以下任何保留字符
    • ,
    • ()
    • &
    • |
    • !
  • 代码示例

代码添加好标签之后,还需要在配置文件中配置相应的信息,或者使用命令行指定需要执行的测试用例的标签

package junit5.tag;

import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
public class TagExampleTest {
    //通过 Tag(标签名)注解 即可设置标签,
    @Tag("preprod")
    @Test
    void hogwarts(){
        System.out.println("预生产环境");
    }
    @Tag("test")
    @Test
    void hogwarts2(){
        System.out.println("测试环境");
    }
    @Tag("dev")
    @Test
    void hogwarts3(){
        System.out.println("开发环境");
    }
    //一个测试用例可以打上多个标签
    @Tag("dev")
    @Tag("test")
    @Test
    void hogwarts4(){
        System.out.println("开发+测试环境");
    }
}

2. Maven 结合 tag 构建-修改 pom 文件

  • groups 表示执行包含标签或者标签表达式的用例。
  • excludedGroups 表示不执行包含该标签或者标签表达式的用例。
  • 使用命令 mvn clean test 执行用例。
  • 注意在配置文件中添加plugin时,如果之前配置过maven-surefire-plugin保留一个即可。添加完配置信息记得更新依赖。
    <build>
        <plugins>
            <plugin>
            <!-- jdk8和jdk11必须要有groupId -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.2</version>
                <configuration>
                <!-- 要执行的标签 -->
                    <groups>test</groups>
                <!-- 不要执行的标签 -->
                    <excludedGroups>dev</excludedGroups>
                </configuration>
            </plugin>
        </plugins>
    </build>
    
  • 打开终端 输入mvn clean test执行测试 可以看到在添加了Tag标签和在配置文件添加了标签的配置信息后,我们指定只执行test标签的测试用例生效。

3. Maven 结合 tag 构建-使用命令行构建

  • 注意: 如果使用命令行的同时也配置了 pom 文件, pom 的配置优先级更高
  • 命令行语句格式
    # 执行 test 标签的用例
    mvn clean test -Dgroups="test"
    # 执行不含test 标签的用例
    mvn clean test -DexcludedGroups="test"
    
  • 示例:pom.xml中不做改动,设置需要执行的标签为test,但命令行中输入下方语句,表示需要执行的的标签为dev,回车执行后观察执行结果。
    mvn clean test -Dgroups="dev"
    
  • 可以观察到即使我们使用命令行规定执行的标签为dev标签,但是执行的依旧是pom.xml文件中规定的test标签,是由于 pom 的配置优先级更高。
  • 将配置文件中指定的标签注释掉,更新依赖,我们重新使用上方命令行语句执行。这次执行的测试用例为带有dev标签的测试用例。

Tags 的命名规范

  • 不准为空。
  • 标签不得包含空格。
  • 标签不得包含 ISO 控制字符。如:SOHSTXETX
  • 标签不得包含以下任何保留字符
    • ,
    • ()
    • &
    • |
    • !

Tag 表达式

Tag 表达式 含义 示例
& 表示 与 关系 test1&test2表示执行既包含test1又包含test2的标签
! 表示 非 关系 !test表示执行没有test1标签的用例
| 表示 或 关系 test1|test2表示执行包含test1或包含test2的标签

Tag 表达式的使用

  • 在pom中配置使用 需要注意在xml文件中使用 & 是以 &amp; 方式使用

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <!-- &amp; 在xml 中表示 & 与的关系 -->
                    <groups>test&amp;dev</groups>
                    <!-- 不要执行的标签 -->
<!--                    <excludedGroups>主流程方法</excludedGroups>-->
                </configuration>
                <version>2.22.2</version>
            </plugin>
- 在配置文件中设置只执行既包含test又包含dev的测试用例,更新依赖,打开命令行输入mvn clean test即可执行,可以看到只有一个测试用例既包含test又包含dev标签,所以只有一个测试用例执行。


Tag 表达式结合命令行

在使用命令行执行前,需要将配置文件中指定执行的标签信息清楚,否则按优先级顺序会以配置文件中的信息为准。

# 执行 没有test 标签的用例
mvn clean test -Dgroups="!test"
# 执行 dev 或 test 标签的用例
mvn clean test -Dgroups="dev|test"
# 执行既有 dev 也有 test 标签的用例
mvn clean test -Dgroups="dev&test"
# 执行有 dev 但没有 test 标签的用例
mvn clean test -Dgroups="dev&!test"
注意 视频讲解中非关系!有错误,这里可以使用-Dgroups="!test1"

例:mvn clean test -Dgroups="!test1" 效果为执行非test1标签的测试用例


自定义标签

  • 问题: 如果一个测试用例需要设置多个标签,虽然可以使用添加多个Tag注解解决,但是如果测试时用例数量很多的情况下使用注解解决不免会产生代码冗余,如何解决呢?
  • 解决方案: 直接使用自定义的标签做注解 - 使用步骤 1. 自定义标签 2. 使用自定义标签 3. 使用 mvn clean test 执行

如何自定义标签

  • 定义一个自定义注解,用于标记测试用例 需要在接口前使用@Target注解定义使用目标,以及使用@Retention注解指定运行策略、使用@Tag设定标签。
  • 代码示例
package junit5.tag;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
//@Target(ElementType.METHOD)`是一个元注解,用于指定注解的使用目标为方法。
@Target(ElementType.METHOD)
//`@Retention(RetentionPolicy.RUNTIME)`是一个元注解,用于指定注解的保留策略为运行时保留。
@Retention(RetentionPolicy.RUNTIME)
//设置多个标签
@Tag("pre")
@Tag("dev")
@Tag("test")
@Test
public @interface PreprodTest {
}

使用自定义标签

  1. 使用自定义标签

在这里需要注意对应关系,在接口前使用注解应为我们自定义接口的接口名 - 代码示例

package junit5.tag;

import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
public class TagExampleTest {
    //通过 Tag(标签名)注解 即可设置标签,
    @Test
    @Tag("test")
    void hogwarts2(){
        System.out.println("测试环境");
    }

    @Test
    @Tag("dev")
    void hogwarts3(){
        System.out.println("开发环境");
    }
    //一个测试用例可以打上多个标签

    @Test
    @Tag("dev")
    @Tag("test")
    void hogwarts4(){
        System.out.println("开发+测试环境");
    }

    //使用自定义标签,将减少代码冗余,多个标签简化为使用一个标签
    @PreprodTest
    void Hogwarts5(){
        System.out.println("PreprodTest01");
    }

    @PreprodTest
    void Hogwarts6(){
        System.out.println("PreprodTest02");
    }
    @PreprodTest
    void hogwarts7(){
        System.out.println("PreprodTest02");
    }
}
3. 使用 mvn clean test 执行

注意 自定义多个标签时可以推荐使用以下格式

命令行语句
 mvn clean test -Dgroups="test1" -Dgroups="test2" -Dgroups="test3"
 mvn clean test -Dgroups="dev" -Dgroups="pre" -Dgroups="test"

我们在这里尝试两种执行方式 - 配置文件中指定执行标签 + 命令行使用mvn clean test - 命令行使用语句

mvn clean test -Dgroups='Preprod&dev&test'
package com.hogwarts.JUnit5;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
    //设置自定义Tag后使用mvn clean test 执行
class TagExampleTest {
    @CustomTagTest
    void testCustomTag(){
        System.out.println("自定义的标签");

    }

    void testCustomTag2(){
        System.out.println("无自定义标签");

    }
}