JUnit 5 – 早期试用体验 – 第1篇

JUnit5即将发布,带来改进的API及扩展模型,支持模块化架构,可在同一代码库与JUnit4共存。新版本简化了测试方法的可见性要求,引入了更直观的生命周期注解,并增强了断言功能。
\

主要结论

\
  • JUnit 5就要来了! \
  • 其中包含改进的API和扩展模型将大幅完善“JUnit工具”。 \
  • 模块化的体系结构使得“JUnit平台”可以用于其他测试框架。 \
  • 虽然经过了彻底重写,但可在同一个代码基中与老版本Junit共存。
\

由专职开发者组成的团队目前正在着手开发JUnit 5,这一Java世界最受欢迎程序库的下个版本。虽然表面上只是陆续提供一些细枝末节的改进,但内部创新非常多,甚至有望重新定义JVM测试。 \

2015年11月发布原型并在2016年2月发布Alpha测试版后,7月的第一周他们发布Milestone 1版本。我们打算体验一下! \

在该系列的第一篇文章中,我们将介绍如何开始编写测试,介绍新版本包含的所有细微改进,讨论JUnit团队为何决定现在进行重写,此外最重要的是,还将介绍新的体系结构如何彻底革新JVM测试。 \

该系列的第二篇文章将更深入地介绍如何运行测试,介绍JUnit提供的一些炫酷新功能,并演示如何对核心能力进行扩展。 \

编写测试

\

首先从媒体资源开始看看如何快速写出需要的测试。 \

五秒钟设置完毕

\

下文还将更为深入地介绍配置和体系结构。现在先看看如何将这些内容导入我们选择的构建工具:

org.junit.jupiter:junit-jupiter-api:5.0.0-M1\org.junit.jupiter:junit-jupiter-engine:5.0.0-M1\org.junit.platform:junit-platform-runner:1.0.0-M1
\

就这么简单,一旦完整的JUnit 5支持彻底实现,只需要junit-jupiter-api就够了。(下文将进一步介绍) \

随后需要一个用来包含这个测试的类:

package com.infoq.junit5;\\import org.junit.platform.runner.JUnitPlatform;\import org.junit.runner.RunWith;\\@RunWith(JUnitPlatform.class)\public class JUnit5Test {\    // tests go here\}
\

至此已经全部搞定,可以开始编写JUnit 5测试并通过IDE或构建工具执行。 \

一个简单示例

\

对于较为简单的测试,几乎没什么太大变化:

@RunWith(JUnitPlatform.class)\public class JUnit5Test {\\    @BeforeAll\    static void initializeExternalResources() {\     System.out.println(\"Initializing external resources...\");\    }\\    @BeforeEach\    void initializeMockObjects() {\     System.out.println(\"Initializing mock objects...\");\    }\\    @Test\    void someTest() {\     System.out.println(\"Running some test...\");\     assertTrue(true);\    }\\    @Test\    void otherTest() {\     assumeTrue(true);\\     System.out.println(\"Running another test...\");\     assertNotEquals(1, 42, \"Why wouldn't these be the same?\");\    }\\    @Test\    @Disabled\    void disabledTest() {\     System.exit(1);\    }\\    @AfterEach\    void tearDown() {\     System.out.println(\"Tearing down...\");\    }\\    @AfterAll\    static void freeExternalResources() {\     System.out.println(\"Freeing external resources...\");\    }\\}
\

表面上JUnit 5只是陆续提供一些细枝末节的改进,但真正的革新都在内部,稍后会介绍这些内容。首先一起来看看这一版本中一些最显著的改进。 \

诸多改进

\

可见性

\

最显著的变化是,测试方法不再必须设置为公开的。这就针对程序包提供了足够的可见性(但私有测试无法实现),借此可以避免测试类充斥着乱七八糟的公开关键字。 \

理论上,测试类也可以使用默认可见性。但因为上文使用了简单的配置过程,我们的工具只能在公开的类中扫描注解(Annotation),JUnit 5的支持彻底实现后这一情况将有所改善。 \

测试生命周期

\

@Test \

JUnit 4最基本的注解是@Test,可用于标记作为测试运行的方法。 \

该注解几乎没什么变化,不过已经不再接受可选参数,预期异常可通过断言(Assertion)进行验证。(但目前还没有超时的替代品) \

Before和After

\

为了运行代码以配置并取消测试,可以使用@BeforeAll@BeforeEach@AfterEach,以及@AfterAll。它们的名称变得更恰当,但与JUnit 4中的@BeforeClass@Before@After,以及@AfterClass使用了完全相同的语义。 \

因为每个测试都需要新建一个实例,并且@BeforeAll / @AfterAll只能对它们统一调用一次,可能无法确定要使用哪个实例,因此只能将其设置为静态(与JUnit 4中的@BeforeClass@AfterClass情况类似)。 \

如果使用同一个注解标注了不同方法,将刻意使用未指定的顺序执行。 \

禁用测试

\

测试可直接使用@Disabled禁用,这一点类似于JUnit 4中的@Ignored。但这只是特殊情况的Condition,下文介绍JUnit的扩展时还将详细讨论。 \

断言

\

一切配置并执行完毕后,最后需要通过断言验证期望行为。这一领域也有很多细微的改进: \

  • 断言消息已经可以包含在参数列表中,这样即可用更为统一的方式执行包含或不包含消息的调用,因为前两个参数始终是预期的实际值,随后才是可选参数。 \
  • 使用Lambda将能更自由地创建断言消息,如果创建过程耗时长久,这一点有助于提高性能。 \
  • 布尔(Boolean)断言已经可以接受谓语。

另外还有新增的assertAll,可用于检查一组相关调用(Invocation)的结果,并判断断言是否失败,虽然无法短路但可输出所有结果的值:

@Test\void assertRelatedProperties() {\    Developer dev = new Developer(\"Johannes\
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值