JUnit5注释的基础使用

✨✨✨学习的道路很枯燥,希望我们能并肩走下来!

编程真是一件很奇妙的东西。你只是浅尝辄止,那么只会觉得枯燥乏味,像对待任务似的应付它。但你如果深入探索,就会发现其中的奇妙,了解许多所不知道的原理。知识的力量让你沉醉,甘愿深陷其中并发现宝藏。



本篇主要是记录常用Junit注释的使用,使用对应注释解决带参数不带参数,如有错误,请在评论区指正,让我们一起交流,共同进步!


本文开始

1.使用junit5的依赖

可以去maven中央仓库,下载

2.自定义测试文件命名规则

junit5文件默认命名规则:Test开头或Test结尾

使用插件自定义配置:自动识别文件下以TestCase结尾的测试文件,默认规则不会识别了;

 		<plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.2</version>
            <configuration>
	        <includes>
	            <include>**/*TestCase.java</include>
	        </includes>
	   		 </configuration>
        </plugin>

3.常用注释

3.1 简单测试注释

  • 声明测试方法 -@Test 注解
  • 定义别名 -@DisplayName(“你要给用例起的名字”)
  • @BeforeAll + @AfterAll
    每个测试类前后执行一次
    all修饰 static 方法
  • @BeforeEach + @AfterEach
    每个测试用例前后都执行一次
    【注】一起存在,先执行all, 再执行each

3.2 测试类继承后,all和each间的执行顺序

前提:测试A类,B类中都有@BeforeAll+@AfterAll+@BeforeEach + @AfterEach,且B类继承A类

运行顺序:
A类的@BeforeAll, B类@BeforeAll
A类@BeforeEach,B类@BeforeEach
再执行A类的测试方法,
执行完后,执行B类@BeforeEach,A类@BeforeEach
再重新执行A类@BeforeEach,B类@BeforeEach
执行B类中的测试方法
执行B类测试方法后,执行B类@BeforeEach,A类@BeforeEach
最后执行B类@AfterAll,A类@AfterAll

【注】all前方法=》each前方法=》测试方法=》each后方法=》all后方法;加粗字体可能循环执行;

3.2 断言方法

基于Assertions类的断言方法

  • assertEquals(期望值,实际值)
    断言期望值==实际值
  • assertTrue
    期望为真:asserTrue(2>1)
  • assertNotNull
    期望不等于空
  • assertAll()
    分组断言:某个情况失败了,也会继续执行其他断言

3.2.1 集中断言

第一种:直接在assertAll中使用lambda表达式,即使一个断言失败,仍会进行进行余下的断言

	//第一个参数可以替换:声明是什么断言
	assertAll("All",
               () -> assertEquals(2, 1 + 1),
               () -> assertNotNull(2)
	        );

第二种:将断言结果放到lists中,然后在assertAll中使用流统一断言

	//1.创建一个收集断言结果的容器
	ArrayList<Executable> lists = new ArrayList<>();
    for(int i = 0; i < 10; i++){
    	//2.获取加法结果
        int ret = Calculator.add(1,i);
        //3.期望值
        int expect = i;
        //4.将中间结果保存到list中,后面统一断言
        assertList.add(()->assertEquals(expect,ret ));
    }
    assertAll("输出add结果",lists.stream());

4. 执行带参数的测试用例

4.1 配置参数环境

		<dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>5.8.1</version>
            <scope>test</scope>
        </dependency>

4.1 单参数配置

【注】@Test注释与@ParameterizedTest不一起用

  • 参数注释:@ParameterizedTest
  • 单参数的注释:@ValueSource(参数)
    参数支持基本数据类型+s
    特殊的是strings, classes
    如:@ValueSource(strings={“zs”,“lisi”})

4.2 多参数配置

【注】有几个参数,测试方法上就需要几个参数

  • 多参数注释:@CsvSource(values={“张三,1”, “李四,2”})
    通过默认分隔符逗号分隔,可修改
  • 修改多参数分隔符:通过属性delimiterString指定
    @CsvSource(value = {“张三|1”, “李四|2”}, delimiterString = “|”)
  • 多参数文件参数化注解 @CsvFileSource(resources = “/data.csv”)
    在目录 test/resources 中新增 csv 文件
    参数:csv文件路径

4.3 @MethodSource 参数化

【注】

  • 参数必须是静态的工厂方法,或者测试类被注释为@TestInstance(Lifecycle.PER_CLASS)
  • 在 @MethodSource 注解中未指明方法名,会自动调用与测试方法同名的静态方法

第一种在 @MethodSource 中指定方法名称

    @ParameterizedTest
    @MethodSource("stringTest")
    void testMethodSource(String arg) {
        assertNotNull(arg);
    }

    static Stream<String> stringTest() {
        // 返回字符串流
        return Stream.of("zhang", "li");
    }

第二种在 @MethodSource 不指明方法名,框架会找同名的无参数方法

 	@ParameterizedTest
    @MethodSource
    void testMethodSource(Integer arg) {
        assertNotEquals(5, arg);
    }

    static IntStream testMethodSource() {
        //返回int类型的数字流
        return IntStream.of(1,2);
    }

4.4 @EnumSource 参数化

names参数:枚举值

  • 通过names属性指定枚举对象的范围,一个或多个
    @EnumSource(names = {“LS”})
  • 通过mode属性指定规则
    • EXCLUDE: 取反,也就是names中的元素不执行
    • MATCH_ALL:正则匹配,匹配names属性指定的正则表达式

实例:

public class EnumTest {
    //创建枚举类
    public enum UserUnit {
        ZS("zhangsan", 18),
        LS("lisi", 18);
        private final String name;
        private final Integer age;
        UserUnit(String name, Integer age) {
            this.name = name;
            this.age = age;
        }
    }

    @ParameterizedTest
//    @EnumSource(names = {"LS"}, mode = EnumSource.Mode.EXCLUDE)
    //@EnumSource(mode = EnumSource.Mode.MATCH_ALL, names = ".*S")
    @EnumSource(names = {"LS"})
    void testEnumSource(UserUnit userUnit) {
        System.out.println(userUnit.name + "的年龄是" + userUnit.age);

    }
}

4.5 特殊参数的参数化-空值等

  • @NullSource:使用Null参数进行测试输入
  • @EmptySource: 参数为空
  • @NullAndEmptySource :null和空参数化校验
    @NullAndEmptySource 注解结合了 @EmptySource 与 @NullSource
	@ParameterizedTest
    @NullAndEmptySource
    void testNullAndEmptySource(String param) {
        // 断言参数 是空 or null
        assertTrue(param == null || param.isEmpty());
    }

5. 测试用例起别名-如:中文名称

第一种:使用@DisplayName("第一条用例"): 写测试用例名称
第二种:使用 @DisplayNameGenerator 实现生成器
//在测试类上加注释
//1. 默认
@DisplayNameGeneration(DisplayNameGenerator.Standard.class)
//2. 删除没有参数的方法的括号
@DisplayNameGeneration(DisplayNameGenerator.Simple.class)
//3.将测试用例名称有下划线 ‘_’ 的替换成空格
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
//4.显示测试用例名称:使用类名,方法名方式显示
@DisplayNameGeneration(DisplayNameGenerator.IndicativeSentences.class)

生成器可以使用全局配置: junit-platform.properties文件
配置查找junit官网
【注】配置只需要修改$符合后面的值即可

# 全局配置显示名称为连接类名与方法名
junit.jupiter.displayname.generator.default = \
org.junit.jupiter.api.DisplayNameGenerator$IndicativeSentences

6. 指定测试类或测试用例排序

6.1 测试用例/方法排序

测试类加上:@TestMethodOrder(参数)
每个测试类中的方法加注释:@Test

  • 根据@Order排序:
    @TestMethodOrder(OrderAnnotation.class)
    • 测试方法上加:@Order() 如:@Order(1),@Order(2)
      参数小的先执行
  • 根据名称排序
    @TestMethodOrder(MethodOrderer.DisplayName.class)
    • 测试方法上加:@DisplayName(“a”) : 根据参数name排序
  • 随机排序
    @TestMethodOrder(MethodOrderer.Random.class)
  • 根据方法排序
    • @TestMethodOrder(MethodOrderer.MethodName.class)
      根据方法名称排序

6.2 根据类排序

测试类上加上:TestClassOrder(参数)
每个测试类中的类加注释:@Nested

  • 根据Order参数排序
    @TestClassOrder(ClassOrderer.OrderAnnotation.class)

    • 测试类中加@Order(1)
  • 根据名称排序
    @TestClassOrder(ClassOrderer.DisplayName.class)

    • 测试类中加@DisplayName(“a”)
  • 随机排序
    @TestClassOrder(ClassOrderer.Random.class)

  • 根据类名排序
    @TestClassOrder(ClassOrderer.ClassName.class)

6.3 配置文件中配置方法或类的执行顺序

  • 在resources目录下创建junit-platform.properties
  • 配置文件内容:
    $ 后面的规则可以跟换参数
    • OrderAnnotation
    • DisplayName
    • Random
    • ClassName/MethodName
# 方法配置
junit.jupiter.testmethod.order.default = 
org.junit.jupiter.api.MethodOrderer$OrderAnnotation
# 类配置
junit.jupiter.testclass.order.default = 
org.junit.jupiter.api.ClassOrderer$DisplayName

7. mvm命令行执行测试用例

7.1 命令行执行

  • 执行当前项目下所有测试用例:
    mvn test
  • 执行单个测试类:
    mvn test -Dest=包名.类名
  • 执行单个测试用例:
    mvn test -Dest=包名.类名#方法名
  • 执行同一个包下的测试类:
    mvn test -Dtest=包名.类名1,包名.类名2
  • 执行不同包下的测试类:
    mvn test -Dtest=包名1.类名1,包名2.类名2
  • 正则匹配执行测试用例:
    mvn test -Dtest=“包名.*Test”
  • 执行多个测试用例(+号连接测试方法):
    mvn test -Dtest=包名.类名#方法名1+方法名2

7.2 配置文件执行

三种设置条件:

通过 < include > 标签设置要执行的测试类
可以是 类名.java
可以直接是 类名
可以是 类名.class

  • 执行单个测试类
    < include >包名/类名.java< /include>
    < include>包名/类名< /include>
    < include>包名/类名.class< /include>
    【注】包名间使用 / 分割
  • 同一个包执行测试类
    < include>包名1/* < /include>
    < include>包名1/*.java< /include>
  • 不同包下执行测试类
    < include>包名1/类名1.java< /include>
    < include>包名2/类名2.java< /include>
  • 正则匹配执行测试用例:
    < include>包名/*Test</ include>

总结

✨✨✨各位读友,本篇分享到内容是否更好的让你理解了 (),如果对你有帮助给个👍赞鼓励一下吧!!
🎉🎉🎉世上没有绝望的处境,只有对处境绝望的人。
🎉🎉🎉一遇挫折就灰心丧气的人,永远是个失败者。而一向努力奋斗,坚韧不拔的人会走向成功。
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!

  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值