假设

Assumptions 类提供静态方法来支持基于假设的条件测试执行。

失败的假设会导致测试中止。
当继续执行给定的测试方法没有意义时,通常会使用假设。
在测试报告中,这些测试将被标记为通过。

JUnit jupiter Assumptions 类有两个这样的方法:assumeFalse()assumeTrue()

public class AppTest {
    @Test
    void testOnDev() 
    {
        System.setProperty("ENV", "DEV");
        Assumptions.assumeTrue("DEV".equals(System.getProperty("ENV")), AppTest::message);
    }

    @Test
    void testOnProd() 
    {
        System.setProperty("ENV", "PROD");
        Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));  
    }

    private static String message () {
        return "TEST Execution Failed :: ";
    }
}

安装

我们可以在 maven 或者 gradle 项目中使用 JUnit 5,方法是包含至少两个依赖项,例如:Jupiter Engine Dependency 和 Platform Runner Dependency。

//pom.xml
<properties>
	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	<maven.compiler.source>1.8</maven.compiler.source>
	<maven.compiler.target>${maven.compiler.source}</maven.compiler.target>
	<junit.jupiter.version>5.5.2</junit.jupiter.version>
	<junit.platform.version>1.5.2</junit.platform.version>
</properties>
<dependencies>
	<dependency>
		<groupId>org.junit.jupiter</groupId>
		<artifactId>junit-jupiter-engine</artifactId>
		<version>${junit.jupiter.version}</version>
		<scope>test</scope>
	</dependency>
	<dependency>
		<groupId>org.junit.platform</groupId>
		<artifactId>junit-platform-runner</artifactId>
		<version>${junit.platform.version}</version>
		<scope>test</scope>
	</dependency>
</dependencies>
//build.gradle
testRuntime("org.junit.jupiter:junit-jupiter-engine:5.5.2")
testRuntime("org.junit.platform:junit-platform-runner:1.5.2")

JUnit 5 架构

与 JUnit 4 相比,JUnit 5 由来自三个不同子项目的几个不同模块组成:

JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage
  • JUnit 平台
    为了能够启动 junit 测试,IDE、构建工具或者插件需要包含和扩展平台 API。它定义了用于开发在平台上运行的新测试框架的“TestEngine”API。
    它还提供了一个控制台启动器来从命令行启动平台并为 Gradle 和 Maven 构建插件。
  • JUnit Jupiter
    它包括用于编写测试的新编程和扩展模型。它具有所有新的 junit 注释和 TestEngine实现来运行使用这些注释编写的测试。
  • JUnit Vintage
    它的主要目的是支持在 JUnit 5 平台上运行 JUnit 3 和 JUnit 4 书面测试。它有向后兼容性。

断言

断言有助于使用测试用例的实际输出来验证预期输出。
为了简单起见,所有 JUnit Jupiter 断言都是 org.junit.jupiter.Assertions 类中的静态方法,例如

assertEquals()assertNotEquals()

void testCase() 
{
    //Test will pass
    Assertions.assertNotEquals(3, Calculator.add(2, 2));

    //Test will fail 
    Assertions.assertNotEquals(4, Calculator.add(2, 2), "Calculator.add(2, 2) test failed");

    //Test will fail 
    Supplier<String> messageSupplier  = ()-> "Calculator.add(2, 2) test failed";
    Assertions.assertNotEquals(4, Calculator.add(2, 2), messageSupplier);
}

阅读更多:JUnit 5 断言

on it road .com

在 JUnit 5 中编写测试

JUnit 4 和 JUnit 5 在测试编写风格上没有太大变化。
这是使用生命周期方法的示例测试。

import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import com.onitroad.junit5.examples.Calculator;
public class AppTest {

	@BeforeAll
	static void setup(){
		System.out.println("@BeforeAll executed");
	}

	@BeforeEach
	void setupThis(){
		System.out.println("@BeforeEach executed");
	}

	@Tag("DEV")
	@Test
    void testCalcOne() 
	{
		System.out.println("======TEST ONE EXECUTED=======");
		Assertions.assertEquals( 4 , Calculator.add(2, 2));
    }

	@Tag("PROD")
	@Disabled
	@Test
    void testCalcTwo() 
	{
		System.out.println("======TEST TWO EXECUTED=======");
		Assertions.assertEquals( 6 , Calculator.add(2, 4));
    }

	@AfterEach
	void tearThis(){
		System.out.println("@AfterEach executed");
	}

	@AfterAll
	static void tear(){
		System.out.println("@AfterAll executed");
	}
}
JUnit 5教程

JUnit 5 是最广泛使用的 Java 应用程序测试框架。
很长一段时间以来,JUnit 一直在完美地完成它的工作。
在这两者之间,JDK 8 带来了非常令人兴奋的 Java 特性,尤其是 lambda 表达式。

JUnit 5 旨在适应 Java 8 编码风格和其他几个特性,这就是为什么需要 Java 8 在 JUnit 5 中创建和执行测试(尽管为了向后兼容,可以执行用 JUnit 3 或者 JUnit 4 编写的测试) .

测试套件

使用 JUnit 5 测试套件,我们可以运行分布到多个测试类和不同包中的测试。
JUnit 5 提供了两个注解:@SelectPackages 和@SelectClasses 来创建测试套件。

要执行该套件,我们将使用 @RunWith(JUnitPlatform.class)

@RunWith(JUnitPlatform.class)
@SelectPackages("com.onitroad.junit5.examples")
public class JUnit5TestSuiteExample 
{
}

此外,我们可以使用以下注释来过滤测试包、类甚至测试方法。

  • @IncludePackages@ExcludePackages过滤包
  • @IncludeClassNamePatterns@ExcludeClassNamePatterns来过滤测试类
  • @IncludeTags@ExcludeTags来过滤测试方法
@RunWith(JUnitPlatform.class)
@SelectPackages("com.onitroad.junit5.examples")
@IncludePackages("com.onitroad.junit5.examples.packageC")
@ExcludeTags("PROD")
public class JUnit5TestSuiteExample 
{
}

JUnit 5 注释

JUnit 5 提供以下注释来编写测试。

Annotation描述
@BeforeEach带注释的方法将在测试类中的每个测试方法之前运行。
@AfterEach带注释的方法将在测试类中的每个测试方法之后运行。
@BeforeAll带注释的方法将在测试类中的所有测试方法之前运行。这个方法必须是静态的。
@AfterAll带注释的方法将在测试类中的所有测试方法之后运行。这个方法必须是静态的。
@Test它用于将方法标记为junit测试
@DisplayName用于为测试类或者测试方法提供任何自定义显示名称
@Disable它用于禁用或者忽略测试套件中的测试类或者方法。
@Nested用于创建嵌套测试类
@Tag用标签标记测试方法或者测试类以进行测试发现和过滤
@TestFactory标记方法是动态测试的测试工厂
日期:2020-09-17 00:10:56 来源:oir作者:oir