准备

添加maven依赖:

<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.1.0</version>
<scope>test</scope>
</dependency>

基础注解

1. @BeforeAll and @BeforeEach

@BeforeAll
static void setup() {
log.info("@BeforeAll - executes once before all test methods in this class");
} @BeforeEach
void init() {
log.info("@BeforeEach - executes before each test method in this class");
}

⚠️:@BeforeAll 注解的方法必须是static的,否则代码无法编译。

2. @DisplayName and @Disabled

@DisplayName("Single test successful")
@Test
void testSingleSuccessTest() {
log.info("Success");
} @Test
@Disabled("Not implemented yet")
void testShowSomething() {
}

@DisplayName:指定该测试显示的名称

@Disabled:禁用某个测试,并指定该测试的显示名称

3. @AfterEach and @AfterAll

@AfterEach
void tearDown() {
log.info("@AfterEach - executed after each test method.");
} @AfterAll
static void done() {
log.info("@AfterAll - executed after all test methods.");
}

⚠️:@AfterAll 注解的方法必须是static的,否则代码无法编译。


断言和假设

断言

断言已移至org.junit.jupiter.api.Assertions,并且已得到明显改善。如前所述,您现在可以在断言中使用lambda:

@Test
void lambdaExpressions() {
assertTrue(Stream.of(1, 2, 3)
.stream()
.mapToInt(i -> i)
.sum() > 5, () -> "Sum should be greater than 5");
}

尽管上面的示例很简单,但是将lambda表达式用于断言消息的一个优点是可以对它进行延迟计算,如果消息的构建成本很高,则可以节省时间和资源。

现在还可以使用assertAll()来对断言进行分组,这将使用MultipleFailuresError报告组内任何失败的断言:

@Test
void groupAssertions() {
int[] numbers = {0, 1, 2, 3, 4};
assertAll("numbers",
() -> assertEquals(numbers[0], 1),
() -> assertEquals(numbers[3], 3),
() -> assertEquals(numbers[4], 1)
);
}

这意味着现在进行更复杂的断言更加安全,因为您将能够查明任何故障的确切位置。

假设

假设仅在满足某些条件时才用于运行测试。这通常用于测试正常运行所需的外部条件,但这些条件与所测试的内容没有直接关系。

您可以使用assumeTrue(),assumeFalse()和assumptionThat()来声明一个假设。

@Test
void trueAssumption() {
assumeTrue(5 > 1);
assertEquals(5 + 2, 7);
} @Test
void falseAssumption() {
assumeFalse(5 < 1);
assertEquals(5 + 2, 7);
} @Test
void assumptionThat() {
String someString = "Just a string";
assumingThat(
someString.equals("Just a string"),
() -> assertEquals(2 + 2, 4)
);
}

如果假设失败,则抛出TestAbortedException,并且仅跳过测试。 假设也理解lambda表达式。

异常测试

JUnit 5中有两种异常测试方法。这两种方法都可以通过使用assertThrows()方法来实现:

@Test
void shouldThrowException() {
Throwable exception = assertThrows(UnsupportedOperationException.class, () -> {
throw new UnsupportedOperationException("Not supported");
});
assertEquals(exception.getMessage(), "Not supported");
} @Test
void assertThrowsException() {
String str = null;
assertThrows(IllegalArgumentException.class, () -> {
Integer.valueOf(str);
});
}

第一个示例用于验证引发的异常的更多详细信息,第二个示例仅用于验证异常的类型。

测试套件

添加maven依赖:

<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-runner</artifactId>
<version>1.6.1</version>
<scope>test</scope>
</dependency>

为了继续使用JUnit 5的新特性,我们将尝试了解在一个测试套件中聚合多个测试类的概念,以便我们可以一起运行这些类。JUnit 5提供了两个注释:@SelectPackages和@SelectClasses来创建测试套件。

@RunWith(JUnitPlatform.class)
@SelectPackages("com.baeldung")
public class AllUnitTest {}

@SelectPackage用于指定运行测试套件时要选择的包的名称。在我们的示例中,它将运行所有测试。第二个注释@SelectClasses用于指定运行测试套件时要选择的类:

@RunWith(JUnitPlatform.class)
@SelectClasses({AssertionTest.class, AssumptionTest.class, ExceptionTest.class})
public class AllUnitTest {}

例如,上面的类将创建一个包含三个测试类的套件。请注意,这些类不必在一个包中。

动态测试

我们要介绍的最后一个主题是JUnit 5动态测试功能,该功能允许声明和运行在运行时生成的测试用例。与静态测试在编译时定义了固定数量的测试用例相反,动态测试允许我们在运行时动态定义测试用例。

动态测试可以通过带有@TestFactory注释的工厂方法来生成。让我们看一下代码示例:

@TestFactory
public Stream<DynamicTest> translateDynamicTestsFromStream() {
List<String> in = Lists.newArrayList("1", "2", "3");
List<String> out = Lists.newArrayList("one", "two", "three");
return in.stream()
.map(word ->
DynamicTest.dynamicTest("Test translate " + word, () -> {
int id = in.indexOf(word);
assertThat(out.get(id).length()).isGreaterThan(2);
})
);
}

这个例子非常简单易懂。我们想使用分别命名为in和out的两个ArrayList翻译单词。工厂方法必须返回Stream,Collection,Iterable或Iterator。在本例中,我们选择Java 8 Stream。

请注意,@ TestFactory方法不得为私有或静态。测试的数量是动态的,并且取决于ArrayList的大小。

总结

我们可以看到JUnit 5的体系结构发生了很大变化,这与平台启动器,与构建工具,IDE,其他单元测试框架的集成等有关。此外,JUnit 5与Java 8的集成程度更高,尤其是与Lambdas和Stream概念。


注:本文翻译自原文:https://www.baeldung.com/junit-5 ,并且在此基础上有改动。

JUnit 5基础指南的更多相关文章

  1. JUnit单元测试基础要点

    JUnit单元测试基础要点 1.JUnit是一种测试代码的框架,测试的目的是:保证代码没错,而不是保证代码正确. 2.测试类一般不要和目标类放在一起,但编译成的class文件是放在一起的. 3.单元测 ...

  2. Linux命令之Nano基础指南

    Nano基础指南 1.  Nano基础 目的 这是篇nano简明使用指南,帮助你快速了解nano的基本用法.如想获取更多的帮助信息,请参阅: http://www.nano-editor.org 打开 ...

  3. npm scripts 脚本基础指南

    什么是npm脚本? npm 允许在package.json文件里面,使用scripts字段定义脚本命令. 初始化package.json -> npm init -> 经历一系列的问答即可 ...

  4. 【TPM】tpm搭建基础指南

    pm君第一次通过各种摸索,成功搭建了tpm模拟环境,本篇博客记录了如何去搭建tpm模拟环境,希望能给大家一些帮助. 参考资料(推荐看) ubuntu下安装TPM模拟器 --成功步骤:参考至第2节-安装 ...

  5. Junit 测试基础

    /** * 1.测试函数以     @Test  注解, 函数名可以根据测试内容自定义但返回值必须是void,不能有参数 * 2.assertEquals(arg0,arg1); 用来判断期待值是否和 ...

  6. Python正则表达式基础指南

    1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十 ...

  7. 自动化测试报告之allure使用基础指南

    差不多三个月前些的教程,然后跳槽了,自定义模块还没有写....后续也不知道有时间补上没有,最近应该会毕竟专注app测试这块了     1.github下载allure安装包:https://githu ...

  8. Junit的基础学习

    一个强大的单元测试框架: 一.组成部分: 1.注解: (1)@Test 注解: 放在测试方法上,表示这是用于测试其他方法的一个测试单元 @Test public void testSum1(){ Sy ...

  9. destoon二次开发基础指南

    代码首先包含common.inc.php文件 在common.inc.php文件中,首先定义常量. define('IN_DESTOON', true); define('IN_ADMIN', def ...

随机推荐

  1. kettle_errot_karafLifecycleListenter

    使用kettle 6.1 通过命令行批量执行作业的过程中,发现偶尔有作业执行时间会变慢几分钟,查看日志发现改作业开始就报了一个错 报错之后才会继续下面的作业,虽然不影响最终作业执行结果,但也延误了一些 ...

  2. jquery.qrcode笔记

    由于一个坑爹的项目需要生成二维码扫描,后台由于数据库比较麻烦,就只能前端做了,于是乎找到Js生成qrcode的一个库:https://github.com/jeromeetienne/jquery-q ...

  3. 【RxJava Demo分析】(二)Schedulers线程调度器 · Hans Zone

    用Schedulers(调度器)实现多任务(并发,Concurrency)的例子 废话不多说我们看一下有关于RxJava的代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

  4. 安卓权威编程指南 -笔记(18章 处理assets)

    resources资源可以存储声音文件,但当处理多个音乐文件时,效率会很低. assets可以被看作随应用打包的微型文件系统,支持任意层次的文件目录结构.类似游戏这样需要加载大量图片和声音资源的应用通 ...

  5. 使用pandas筛选出指定列值所对应的行

    在pandas中怎么样实现类似mysql查找语句的功能: select * from table where column_name = some_value; pandas中获取数据的有以下几种方法 ...

  6. 2——PHP defined()函数

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  7. Dubbo源码解析之SPI(一):扩展类的加载过程

    Dubbo是一款开源的.高性能且轻量级的Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用.智能容错和负载均衡,以及服务自动注册和发现. Dubbo最早是阿里公司内部的RPC框架,于 ...

  8. 面试题57-II.和为s的连续正数序列

    面试题57-II.和为s的连续正数序列 1.题目 LeetCode-面试题57-II.和为s的连续正数序列 输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数 ...

  9. Python中的BeautifulSoup库简要总结

    一.基本元素 BeautifulSoup库是解析.遍历.维护“标签树”的功能库. 引用 from bs4 import BeautifulSoup import bs4 html文档-标签树-Beau ...

  10. 神奇的 SQL 之 ICP → 索引条件下推

    开心一刻 楼主:来,我们先排练一遍 小伙伴们:好 嘿.哈.嚯 楼主:非常好,就是这个节奏,我们开始吧 楼主:啊.啊.啊,疼 ! 你们是不是故意的 ? 回表与覆盖索引 正式讲 ICP 之前了,我们先将相 ...