准备

添加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. Android长按及拖动事件探究

    Android中长按拖动还是比较常见的.比如Launcher中的图标拖动及屏幕切换,ListView中item顺序的改变,新闻类App中新闻类别的顺序改变等.下面就这个事件做一下分析. 就目前而言,A ...

  2. JasperReport框架使用教程(附带常见空白页问题说明)

    概述与安装使用 1. PDF报表概述 概述 ​ 在企业级应用开发中,报表生成.报表打印下载是其重要的一个环节.在之前的课程中我们已经学习了报表中比较重要的一种:Excel报表.其实除了Excel报表之 ...

  3. C++走向远洋——62(项目二1、类模板)

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

  4. python学习记录_IPython基础,Tab自动完成,内省,%run命令_

        这是我第一次写博客,之前也有很多想法,想把自己所接触的,以文本的形式储存,总是没有及时行动.此次下定决心,想把自己所学,所遇到的问题做个记录共享给诸位,与此同时自己作为备忘,感谢各位访问我的博 ...

  5. JavaScript面向对象class

    JavaScript面向对象class 本周逆战班学习的主题是“面向对象”,很多人觉得面向对象很难理解,但其实我们早就在面向对象的思想之中了,今天就让我们再重新认识一下他,主要介绍一下ES6中新增的c ...

  6. js的Set和Map集合

    目录 1.js的Set介绍 1-1.Set基础用法 1-2.Set对象的操作方法 1-3.Set对象的遍历方法 2.js的Set扩展WeakSet篇 3.js的Map介绍 3-1.Map基础用法 3- ...

  7. 19 JPQL

    使用Spring Data JPA提供的查询方法已经可以解决大部分的应用场景,但是对于某些业务来说,我们还需要灵活的构造查询条件,这时就可以使用@Query注解,结合JPQL的语句方式完成查询 @Qu ...

  8. 利用Python爬取OPGG上英雄联盟英雄胜率及选取率信息

    一.分析网站内容 本次爬取网站为opgg,网址为:” http://www.op.gg/champion/statistics” 由网站界面可以看出,右侧有英雄的详细信息,以Garen为例,胜率为53 ...

  9. pyppeteer基本使用demo

    # -*- coding: utf-8 -*- # 类似selenium,支持异步,不需要再单独安装环境,pyppeteer自动安装环境 # 异步await要写到一个函数的内部 from pyppet ...

  10. 转:标签中的href如何调用js

      在HTML中,<a>标签的href属性用于指定超链接的目标的URL.在所有浏览器中,链接的默认外观是: 未被访问的链接带有下划线而且是蓝色的 已被访问的链接带有下划线而且是紫色的 活动 ...