부트캠프/TIL

[부트캠프] TIL - @Nested, JUnit5

purple95 2024. 9. 11. 20:59

 

@Nested 어노테이션은 JUnit 5 에서 테스트 클래스를 내부 클래스로 구성할 때 사용합니다. 이걸로

관련 테스트 케이스들을 논리적으로 그룹화하여 더 명확하고 구조적인 테스트를 작성할 수 있습니다.

 

말이 어렵지만 풀어쓰면

 

큰 테스트 클래스 안에 작은 테스트 그룹(내부 클래스)를 만들어서 서로 관련된 테스트 들을 묶어서 실행시켜주는 것을 의미합니다.

  • 큰 시험을 여러 개의 작은 시험으로 나누는 것과 비슷합니다. 예를 들어, 수학 시험에서 덧셈 문제들뺄셈 문제들을 따로 그룹으로 묶는 것처럼, 테스트도 관련된 부분끼리 묶어서 관리할 수 있습니다.
  • **@Nested**는 테스트 코드 안에서 비슷한 종류의 테스트를 한곳에 모아서 보기 좋게 정리해주는 역할을 합니다.

예시

public class CalculatorTest {

    // 덧셈 테스트 그룹
    @Nested
    class AdditionTests {
        @Test
        void addingTwoPositiveNumbers() {
            // 두 양수의 덧셈 테스트
        }

        @Test
        void addingNegativeNumbers() {
            // 음수 덧셈 테스트
        }
    }

    // 뺄셈 테스트 그룹
    @Nested
    class SubtractionTests {
        @Test
        void subtractingTwoNumbers() {
            // 두 숫자의 뺄셈 테스트
        }
    }
}

 

이렇게 하면 Nested가 관련된 테스트들을 모아서 그룹화 한다는 것을 이해하기 쉽습니다, 추후에 문제가 생긴다면 

어떤 기능에 문제가 발생했는지 쉽게 찾을 수 있습니다.

 

JUnit5

자바 프로그래밍 언어 용 단위 테스트 프레임워크

 

@BeforeEach

각각의 테스트가 실행되기 전에 수행되는 메소드

@BeforeEach
void setUp(){
	System.out.println("각각의 테스트코드가 실행되기 전에 동작.");
}

 

@AfterEach

각각의 테스트가 실행된 후에 수행되는 메소드

@AfterEach
void tearDown(){
	System.out.println("각각의 테스트 코드가 실행된 후에 수행.");
}

 

@BeforeAll

모든 테스트 코드가 수행되기 전에 최초로 수행되는 메소드

**static으로 작성해야 합니다.

 

@Order

테스트를 메소드 단위로 순서를 매길때는 

테스트 클래스에

@TestMethodOrder(MethodOrderer.OrderAnnotation.class) 어노테이션을 적용

그리고 메소드 위에 @Order(n)  n = 1부터 원하는 순서대로 정합니다.

 

@ParameterizedTest

하나의 테스트에 다른 파라미터를 넘기면서 여러번 테스트를 진행하도록 해주는 기능.

@ValueSource(ints = {1, 2, 3, 4, 5, 6, 7, 8, 9})를 사용하여 파라미터 값을 전달 할 수 있습니다.

전달되는 파라미터 수 만큼 테스트 메서드가 수행됩니다.

int, String 등 여러 타입의 파라미터를 전달할 수 있습니다.

@DisplayName("파라미터 값 활용하여 테스트 하기")
@ParameterizedTest
@ValueSource(ints = {1, 2, 3, 4, 5, 6, 7, 8, 9})
void parameterTest(int num) {
System.out.println("5 * num = " + 5 * num);
}

 

 

테스트에 자주 쓰이는 메소드

 

AssertEquals() 

테스트 성공 여부에 따라 AssertionError 를 throw

 

assertEquals(expected, actual, message);

 

expected : 테스트 실시 나올거라 예상되는 값, 

actual : 실행시킬 값 

message : 테스트가 실패할 경우 출력될 메시지.

(람다식으로 메시지를 넣으면 테스트 실패시 메시지가 출력)

 

@Test
public void Test1(){
	int expectedNum = 100;
    Assertions.assertEquals(expectedNum,100);
}
// Pass

@Test
@DisplayName("assertEquals - Supplier")
void test1_1() {
	Double result = calculator.operate(5, "/", 0);
	// 테스트 실패 시 메시지 출력 (new Supplier<String>())
	assertEquals(2.5, result, () -> "연산자 혹은 분모가 0이 아닌지 확인해보세요!");
}

//테스틑 실패시 "연산자 혹은 분모가 0이 아닌지 확인해보세요!" 출력