JUnit 5 最棒的 5 个新特性


本文翻译自:The five coolest new features of JUnit 5

 

您一定听说过 JUnit 5。它似乎很不错。所以,您可能想要迁移到 JUnit 5,但是不确定它是否像宣传的那样好,对吧?在这篇文章中,我将介绍 JUnit 5 的 5 个最佳的新特性和功能。阅读完这个清单后,您肯定迫切希望进行迁移。

 

特性 #1 – 嵌套单元测试

您是否曾经需要将相关的 JUnit 测试组合到一起,编写一个 JUnit 测试套件来执行它们?不是因为您真的需要一个测试套件,而是因为这是实现此目的的唯一方式?您是否曾希望始终将测试限制在同一个类中?如果是,@Nested 将带来及时的帮助!

 

JUnit 5 的新 @Nested 注解特性可用于创建更干净的单元测试类,使用任意嵌套的内部类作为单个测试类中附加的测试组成单元。这使您能够将测试集中在一起,同时能以不同方式初始化它们来模拟不同的运行时条件。

 

对代码执行单元测试,可以测试您的代码可能遇到的所有情况,但是如果无法理解单元测试报告,这又有什么用呢?将相关测试方法嵌套在同一个测试类中,再结合新的 @DisplayName 注解,会让您的单元测试在视觉上大变样。您的单元测试报告从未像现在这么美观!

 

特性 #2 – JUnit 扩展

JUnit 5 扩展模型遵循 JUnit 5 团队的“扩展优于特性”的核心原则,并定义了很多扩展点(已经为它们提供了默认实现,但是还应该为它们创建扩展以覆盖默认行为)。这些扩展是您实现扩展点并注册到 JUnit 5 框架的回调接口,在运行单元测试的时候,当到达该扩展点时,就会调用您的代码。

 

您可能从不需要编写自定义扩展,但好处在于,需要的时候,您可以使用工具供应商使用的相同 API。为了支持 JUnit,工具供应商常常使用其内部 API,这限制了 JUnit 维护者在该框架的演化过程中能做的事情(这是相互矛盾的)。扩展模型通过为您和工具供应商提供一致的公共 API,将推动 JUnit 不断演化。

 

而且,所有公共 API 方法都使用 @API 和类似下面这样的值进行注释:

Experimental – 该特性是新的,JUnit 团队欢迎提供反馈,

Internal – 该特性供 JUnit 内部使用,我们应该避免使用它,

Maintained – 该特性至少在下一个次要版本发布之前很不错(会以向后兼容方式更改)。

扩展让JUnit 5 变得如此灵活,应该使用 JUnit Yoga 作为它的代号。

 

特性 #3 – 条件

谈到扩展,JUnit 5 提供了两个扩展点 – ContainerExecutionCondition 和 TestExecutionCondition接口 – 它们组成了测试执行条件 API。当然,JUnit 4 允许我们通过 @Ignore 注解测试类或方法,JUnit 5 通过 @Disabled 注解来提供此行为。

 

但是如果您愿意,可以为两种测试执行条件 API 方法中的一个创建自己的自定义扩展,以检查当前正在运行的测试,并动态决定是否要运行一个测试类(通过 ContainerExecutionCondition)或方法(通过 TestExecutionCondition)。

 

等等,还有更多!JUnit 5 甚至允许您停用条件,比如说通过 @Disabled 禁用单元测试,所以您也可以运行这些单元测试来查看其是否仍然处于禁用状态。太棒了!

 

特性 #4 – Lambda 支持

您喜欢 lambda,对吧?我的意思是有谁不喜欢呢?编写紧凑代码的能力非常方便。

 

现在该特性已通过使用一些新函数型接口(比如 Executable)而集成到 JUnit 5 中。Assertions.assertAll() 之类的方法接受 Executable... 作为一个可变参数,您可以将该参数替换为一个 lambda 表达式。

 

断言Assertions前置条件(Assumptions中的其他方法使用诸如 Supplier<String> 之类的函数式接口,这使您能够分别使用 lambda 表达式提供消息,使用 BooleanSupplier 提供布尔值结果。

 

特性 #5 – 参数化测试

编写单元测试可能很枯燥,尤其是当您需要使用不同的输入来运行同一个单元测试时。在这种情况下,您必须编写多个单元测试方法,或者在一个方法中编写多个块(这可能给您的单元测试留下不好的印象)。您是否曾经希望让您的单元测试更加动态?如果您可以将一个单元测试方法设置为运行多次,每次使用不同的输入值,那该多好?

 

借助参数化测试,JUnit 5 允许您指定一个或多个来源,为您的单元测试方法提供其运行测试所需的参数值。来源生成参数值,JUnit 5 然后将参数值传递给您的单元测试方法(一次一个),直到传完来源中的所有参数值。以下是 JUnit 5 提供的一些开箱即用来源的示例:

@ValueSource – 用于指定一个基本文字数组,这些文字将一次一个地传递给测试方法。

@MethodSource – 用于在测试类中指定一个或多个静态的无参数方法,它们返回一个 Stream、Iterable、Iterator 或参数值数组供您的测试方法使用。

@CsvSource – 用于指定一组传递给测试方法的文字(基于测试方法中的参数数量而分解为元组)。

@ArgumentSource – 用于创建您自己的自定义参数提供程序。

 

结束语

还有其他一些有用的特性,比如:

如果您正在考虑迁移到 JUnit 5,希望我进一步坚定了您迁移的决心。有了这么多实用的特性,您还有什么理由不迁移?


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值