# JUnit5 测试生命周期

> 原文： [https://howtodoinjava.com/junit5/junit-5-test-lifecycle/](https://howtodoinjava.com/junit5/junit-5-test-lifecycle/)

在 JUnit5 中，测试生命周期由 4 个主要注解驱动，即[**`@BeforeAll`**](//howtodoinjava.com/junit-5/before-all-annotation-example/)， [`@BeforeEach`](//howtodoinjava.com/junit-5/before-each-annotation-example/)， [`@AfterEach`](//howtodoinjava.com/junit-5/after-each-annotation-example/)和[`@AfterAll`](//howtodoinjava.com/junit-5/after-all-annotation-example/)。 同时，每个测试方法都必须标有`@Test`注解。 尽管`@Test`注解不再使用可选参数，但它几乎没有变化。

## 之前和之后

在**单元测试生命周期**中，您首先需要使用一些方法来设置和拆除运行测试的环境或测试数据。

在 JUnit 中，为每个测试创建一个新的测试实例。 `@BeforeAll`和`@AfterAll`注解（按名称清除）在整个测试执行周期中仅应调用一次。 因此，必须将它们声明为`static`。

如果它们是具有相同注解的多个方法（例如，两个具有`@BeforeAll`的方法），则它们的执行顺序不确定。

对于每个测试实例都调用`@BeforeEach`和`@AfterEach`，因此不必是`static`。

```java
public class AppTest {

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

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

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

	@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");
	}
}

```

控制台输出：

```java
@BeforeAll executed

@BeforeEach executed
======TEST ONE EXECUTED=======
@AfterEach executed

@BeforeEach executed
======TEST TWO EXECUTED=======
@AfterEach executed

@AfterAll executed
```

## 禁用测试

要在 JUnit5 中禁用测试，您将需要使用[`@Disabled`](//howtodoinjava.com/junit-5/junit-5-disabled-test-example/)注解。 它等效于 JUnit4 的`@Ignored`注解。

`@Disabled`注解可以应用于测试类（禁用该类中的所有测试方法）或单个测试方法。

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

```

## 断言

在任何测试方法中，我们都需要确定它是否通过失败。 您可以使用[断言](//howtodoinjava.com/junit-5/junit-5-assertions-examples)进行操作。 断言有助于通过测试用例的实际输出来验证期望的输出。 为简单起见，所有 JUnit Jupiter 断言都是[`org.junit.jupiter.Assertions`](http://junit.org/junit5/docs/current/api/org/junit/jupiter/api/Assertions.html)类中的静态方法。

```java
void testCase() 
{
    //Test will pass
    Assertions.assertEquals(4, Calculator.add(2, 2));

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

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

```

要使测试失败，只需使用`Assertions.fail()`方法。

```java
@Test
void testCase() {

    Assertions.fail("not found good reason to pass");
}

```

## 假设

[假设](//howtodoinjava.com/junit-5/junit-5-assumptions-examples)提供了静态方法来支持基于假设的条件测试执行。 假设失败会导致测试中止。 通常在没有必要继续执行给定测试方法的情况下使用假设。 在测试报告中，这些测试将被标记为通过。

假设类有两种方法：`assumeFalse()`，`assumeTrue()`。 第三种方法`assumeThat()`处于实验状态，可能会在将来的版本中得到确认。

```java
@Test
void testOnDev() 
{
    System.setProperty("ENV", "DEV");
    Assumptions.assumeTrue("DEV".equals(System.getProperty("ENV")));
    //remainder of test will proceed
}

@Test
void testOnProd() 
{
    System.setProperty("ENV", "PROD");
    Assumptions.assumeTrue("DEV".equals(System.getProperty("ENV")));
    //remainder of test will be aborted
}

```

**junit 测试生命周期**的所有上述注解和类。 将我的问题放在评论部分。

学习愉快！

[源码下载](https://github.com/lokeshgupta1981/Junit5Examples/tree/master/JUnit5Examples)