本文共 3015 字,大约阅读时间需要 10 分钟。
\\主要结论
\
- JUnit 5就要来了! \
- 其中包含改进的API和扩展模型将大幅完善“JUnit工具”。 \
- 模块化的体系结构使得“JUnit平台”可以用于其他测试框架。 \
- 虽然经过了彻底重写,但可在同一个代码基中与老版本Junit共存。
由专职开发者组成的团队目前正在着手开发JUnit 5,这一Java世界最受欢迎程序库的下个版本。虽然表面上只是陆续提供一些细枝末节的改进,但内部创新非常多,甚至有望重新定义JVM测试。 \
2015年11月发布并在2016年2月发布后,7月的第一周他们了。我们打算体验一下! \
在该系列的第一篇文章中,我们将介绍如何开始编写测试,介绍新版本包含的所有细微改进,讨论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)进行验证。(但目前还没有超时的替代品) \
为了运行代码以配置并取消测试,可以使用@BeforeAll
、@BeforeEach
、@AfterEach
,以及@AfterAll
。它们的名称变得更恰当,但与JUnit 4中的@BeforeClass
、@Before
、@After
,以及@AfterClass
使用了完全相同的语义。 \
因为每个测试都需要新建一个实例,并且@BeforeAll
/ @AfterAll
只能对它们统一调用一次,可能无法确定要使用哪个实例,因此只能将其设置为静态(与JUnit 4中的@BeforeClass
和@AfterClass
情况类似)。 \
如果使用同一个注解标注了不同方法,将刻意使用未指定的顺序执行。 \
测试可直接使用@Disabled
禁用,这一点类似于JUnit 4中的@Ignored
。但这只是特殊情况的Condition,下文介绍JUnit的扩展时还将详细讨论。 \
一切配置并执行完毕后,最后需要通过断言验证期望行为。这一领域也有很多细微的改进: \
另外还有新增的assertAll
,可用于检查一组相关调用(Invocation)的结果,并判断断言是否失败,虽然无法短路但可输出所有结果的值:
@Test\void assertRelatedProperties() {\ Developer dev = new Developer(\"Johannes\
转载地址:http://pezja.baihongyu.com/