JUnit에서 @Before 및 @After 주석을 사용하는 방법

JUnit에서 @Before 및 @After 주석을 사용하는 방법

단위 테스트 모음을 작성할 때 수행해야 하는 테스트와 관련되지 않은 활동이 있을 수 있습니다. 이러한 활동은 모든 형태를 취할 수 있습니다. 테스트를 수행하기 전에 데이터베이스에 연결하거나 리소스를 수집해야 할 수 있습니다. 각 테스트 사례가 실행된 후 일부 리소스를 해제해야 할 수 있습니다.





MAKEUSEOF 오늘의 비디오

단위 테스트 클래스의 범위 밖에서 이러한 비 테스트 관련 활동을 수행하는 것은 불가능하지는 않더라도 지루할 수 있습니다. 테스트 클래스의 성공적인 실행은 이러한 활동에 따라 달라질 수 있으므로 JUnit은 이 문제를 해결하기 위해 두 쌍의 주석을 제공합니다.





@BeforeAll 주석

JUnit 테스트 클래스는 하나 이상의 테스트 메소드를 가질 수 있습니다. @BeforeAll 주석은 특정 메서드가 테스트 클래스의 모든 테스트 메서드보다 먼저 실행되어야 함을 나타냅니다. 이 주석과 연결된 메서드는 테스트 클래스의 테스트 메서드 수에 관계없이 (테스트 시작 시) 한 번만 실행됩니다.





@BeforeAll 주석을 사용하는 모든 방법은 몇 가지 규정을 따라야 합니다. 이러한 메서드는 반환 형식이 void여야 하고 공개여야 하며 비공개가 아니어야 합니다. @BeforeAll 주석은 설정에 이상적입니다. 데이터베이스에 연결 또는 새 파일을 생성합니다. 이 기사에서는 계산기 테스트 클래스를 사용하여 @BeforeAll 주석을 사용하는 방법을 보여줍니다.

계산기 클래스

package com.app; 
public class Calculator {
public static int add(int num1, int num2) {
return num1 + num2;
}
public static int subtract(int num1, int num2) {
return num1 - num2;
}
public static int multiply(int num1, int num2) {
return num1 * num2;
}
public static int divide(int num1, int num2) {
return num1 / num2;
}
}

CalculatorTest 클래스

import static org.junit.jupiter.api.Assertions.*; 
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.DisplayName;

@DisplayName("Test class demonstrating how to use the before and after annotations.")
class CalculatorTest {
@BeforeAll
public static void powerOnCalculator() {
System.out.println("The calculator is on");
}

@Test
@DisplayName("Testing method that adds two integer values.")
public void testAdd() {
assertEquals(7, Calculator.add(3, 4));
}

@Test
@DisplayName("Testing method that subtracts one integer value from another.")
public void testSubtract() {
assertEquals(6, Calculator.subtract(9, 3));
}

@Test
@DisplayName("Testing method that multiplies two integer values")
public void testMultiply() {
assertEquals(10, Calculator.multiply(5, 2));
}

@Test
@DisplayName("Testing method that divides one integer value by another")
public void testDivide() {
assertEquals(2, Calculator.divide(4, 2));
}
}

이 클래스에서 @BeforeAll 주석은 powerOnCalculator() 메서드와 함께 작동하여 테스트 실행 전에 '계산기가 켜져 있습니다'를 인쇄합니다. 테스트가 성공적으로 실행되면 다음 테스트 보고서가 인쇄됩니다.



  BeforeAll 주석 보고서

보시다시피 @BeforeAll 주석과 관련된 메서드는 테스트 보고서에 나타나지 않습니다. 그러나 @BeforeAll 주석 방법에 오류가 있는 경우 테스트 보고서 결과에 이를 실패로 표시합니다.

@BeforeEach 주석

@BeforeAll 주석 방식과 마찬가지로 @BeforeEach 주석 방식은 테스트 보고서에 나타나지 않습니다. @BeforeEach 주석이 달린 메서드는 테스트 클래스의 각 테스트 메서드보다 먼저 실행됩니다. 따라서 테스트 클래스에 두 개의 테스트 메서드가 포함되어 있으면 @BeforeEach 주석이 두 번 실행됩니다.





넷플릭스 한 달에 얼마예요?
import static org.junit.jupiter.api.Assertions.*; 
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@DisplayName("Test class demonstrating how to use the before and after annotations.")
class CalculatorTest {
@BeforeAll
public static void powerOnCalculator() {
System.out.println("The calculator is on");
}
@BeforeEach
public void clearCalculator() {
System.out.println("The calculator is ready");
}
@Test
@DisplayName("Testing method that adds two integer values.")
public void testAdd() {
assertEquals(7, Calculator.add(3, 4));
}
@Test
@DisplayName("Testing method that subtracts one integer value from another.")
public void testSubtract() {
assertEquals(6, Calculator.subtract(9, 3));
}
@Test
@DisplayName("Testing method that multiplies two integer values")
public void testMultiply() {
assertEquals(10, Calculator.multiply(5, 2));
}
@Test
@DisplayName("Testing method that divides one integer value by another")
public void testDivide() {
assertEquals(2, Calculator.divide(4, 2));
}
}

CalculatorTest 클래스에 @BeforeEach 주석을 추가하면 다음 출력이 생성됩니다.

  BeforeEach 주석 출력

@BeforeEach 주석과 연결된 메서드는 각 테스트 메서드 전에 한 번씩 네 번 실행됩니다. @BeforeEach 메서드는 정적이 아니며 반환 유형이 무효이며 비공개가 아니라는 점에 유의해야 합니다. 이는 필수 조항이기 때문입니다. @BeforeEach 어노테이션과 연관된 메소드가 @BeforeAll 메소드 이후에 실행된다는 점에 주목하는 것도 중요합니다.





@AfterAll 주석

@AfterAll 주석이 있는 메서드는 테스트 클래스의 모든 테스트 메서드가 실행을 완료한 후에 실행됩니다. @AfterAll 주석은 다음과 같은 경우에 이상적입니다. 기본 파일 작업 , 파일을 닫거나 데이터베이스에서 연결을 끊는 것과 같습니다. @AfterAll 주석은 @BeforeAll 주석에 대응하는 것입니다. @BeforeAll 주석과 마찬가지로 @AfterAll 주석은 정적이어야 하고 void를 반환해야 하며 비공개가 아니어야 합니다.

@AfterAll 
public static void powerOffCalculator() {
System.out.println("The calculator is off");
}

@AfterAll 주석이 달린 메서드를 기존 CalculatorTest 클래스에 추가하면 콘솔에 다음 출력이 인쇄됩니다.

  AfterAll 주석 출력

@AfterAll 주석을 사용하는 powerOffCalculator() 메서드는 모든 테스트 메서드가 실행된 후 테스트 클래스의 끝에 인쇄됩니다.

@AfterEach 주석

@AfterEach 주석은 @BeforeEach 주석에 대응합니다. @BeforeAll 및 @AfterAll 주석과 약간 다른 동일한 필수 규정이 있습니다. @AfterEach 주석과 @BeforeEach 주석(이름 제외)을 구별하는 것은 @AfterEach 메소드가 각 테스트 메소드 후에 실행된다는 것입니다.

@AfterEach 
public void returnResults() {
System.out.println("The results are ready");
}

CalculatorTest 클래스를 실행하면 콘솔에 다음 출력이 인쇄됩니다.

  AfterEach 주석 출력

출력은 @AfterEach 주석(returnResults)과 연결된 메서드가 네 번 인쇄됨을 보여줍니다. returnResults() 메서드의 각 실행은 각 단위 테스트가 실행된 후에만 발생합니다. 이는 returnResults() 메서드 출력이 @BeforeEach 주석과 연결된 메서드의 각 출력 뒤에 나타난다는 사실에서 분명합니다.

누구의 번호인지 알아내다

주석을 사용하여 테스트 스위트 다듬기

JUnit을 사용하면 전후 쌍 주석을 사용하여 비테스트 관련 프로세스를 처리할 수 있습니다. 이 네 가지 주석은 테스트에 가치를 더하는 몇 가지 다른 주석 목록에 속합니다. JUnit의 또 다른 주석은 @DisplayName입니다.

전체 CalculatorTest 클래스를 표시하는 두 개의 코드 예제는 @DisplayName 주석을 사용합니다. @DisplayName 주석은 테스트 클래스 및 테스트 메서드에 대해 보다 의미 있는 이름을 만드는 데 도움이 됩니다.