假设
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 | 标记方法是动态测试的测试工厂 |