假设
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 断言
在 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 是最广泛使用的 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 | 标记方法是动态测试的测试工厂 |
