Sad Puppy 3 Java 애플리케이션 테스트 라이브러리: JUnit5 AssertJ :: 개발자 아지트

두 가지 모두 테스트 코드를 작성할 때 필수적인 도구로서 각각의 역할이 있습니다.

1. JUnit 5:

  • 테스트 프레임워크: JUnit은 자바에서 가장 널리 사용되는 테스트 프레임워크 중 하나이다. 버전 5에서는 JUnit Jupiter로 불리며, JUnit의 최신 버전이다. 
  • 주요 특징:
    • 단위 테스트통합 테스트를 위한 풍부한 기능을 제공합니다.
    • 어노테이션 기반: @Test, @BeforeEach, @AfterEach와 같은 어노테이션을 통해 테스트 실행 전후의 동작을 정의할 수 있다. 
    • Assertions 및 Assumptions: 테스트에서 특정 조건을 검증할 수 있게 해주는 assertEquals, assertTrue 등의 메서드를 제공한다. 
    • 확장 가능한 아키텍처: 커스텀 확장 기능을 만들 수 있으며, 다양한 라이브러리와 쉽게 연동할 수 있다.

 

2. AssertJ:

  • 테스트 검증 라이브러리: AssertJ는 JUnit의 Assertions 메서드보다 더 풍부하고 가독성이 좋은 메서드 체이닝 스타일의 Assertions를 제공합니다.
  • 주요 특징:
    • 가독성: AssertJ의 검증 구문은 사람이 읽기 쉽게 설계되어 있습니다. 예를 들어 Assertions.assertThat(actual).isEqualTo(expected);와 같은 구문으로 검증할 수 있습니다.
    • 유연성: 다양한 타입의 데이터(List, Map, Optional 등)에 대한 검증 메서드가 제공되어 복잡한 조건도 쉽게 검증할 수 있습니다.
    • 메서드 체이닝: 다양한 검증 메서드를 체이닝하여 간결하고 직관적인 테스트 코드를 작성할 수 있습니다.

 

 

// JUnit 5에서 제공하는 어노테이션을 불러온다.
import org.junit.jupiter.api.Test; 

// AssertJ 라이브러리에서 제공하는 정적 메서드 assertThat을 불러옴 
// 이렇게 static import를 하면 메서드 클래스 이름 없이 바로 사용할 수 있다. 
import static org.assertj.core.api.Assertions.assertThat; 


// 테스트 클래스를 정의하는 부분
class MyServiceTest {
	
    // 해당 어노테이션을 통해 메서드가 테스트 메서드 임을 표시함
    // JUnit이 이 어노테이션이 붙은 메서드를 실행함 
    // JUnit 5의 어노테이션
    // 이 어노테이션이 붙은 메서드는 테스트 메서드로 실행됨
    @Test 
    void testService() {
    	// 테스트를 위해 필요한 데이터나 상태 설정
        // 준비 (Given)
        // 테스트 할 값을 actual 변수에 할당함
        String actual = "Hello World";
		
        
        // AssertJ라이브러리에서 제공하는 검증 시작 메서드
        // assertThat(actual)은 검증대상 (actual)을 지정함
        // 이후 체이닝 방식으로 다양한 검증 메서드를 연결할 수 있음 
        // 검증 (Then)
        assertThat(actual)
            .isNotNull() // 체이닝 메서드 중 하나로, actual이 null이 아닌지 검증, actual이 null이면 테스트 실패
            .startsWith("Hello") // actual 문자열이 "Hello"로 시작하는지 검증
            .endsWith("World") // actual 문자열이 "Word"로 끝나는지 검증 
            .isEqualTo("Hello World"); // actual 문자열이 정확히 "Hello World"인지 검증
    }
}

 

위의 예시에서 @Test 어노테이션은 JUnit 5에서 테스트 메서드를 나타내고, assertThat은 AssertJ에서 제공하는 검증 메서드이다. 이런 식으로 JUnit 5로 테스트 환경을 설정하고, AssertJ로 더 가독성 있는 검증을 수행할 수 있다.

 

package baseball;

import java.util.ArrayList;
import java.util.List;
import camp.nextstep.edu.missionutils.Randoms;
import camp.nextstep.edu.missionutils.Console;

public class Application {
    public static void main(String[] args) {
        List<Integer> computer = new ArrayList<>();


        while(true) {
            int exitval = 0;
            String num;
            String con;

            while (computer.size() < 3) {
                int ranValue = Randoms.pickNumberInRange(1, 9);
                if (!computer.contains(ranValue)) {
                    computer.add(ranValue);
                }
            }
//
            //System.out.println("computer:"+ computer);

            System.out.println("숫자 야구 게임을 시작합니다. ");

            System.out.println("숫자를 입력해주세요 : ");

            num = Console.readLine();
            if (num.length() != 3 || !num.matches("[1-9]{3}") || hasDuplicateDigits(num)) {
                throw new IllegalArgumentException();
            }
            // 첫 번째 자리수
            int tmpNum = Integer.parseInt(num);
            int one = (tmpNum / 100);

//                System.out.println("one:"+one);
            // 두 번째 자리수
            int two = ((tmpNum % 100) / 10);

//                System.out.println("two:"+two);
            // 세 번째 자리수
            int thr = (tmpNum % 10);
//                System.out.println("thr:"+thr);

            // 100의 자리 수가 같은 경우
            int checkS = 0;
            int checkB = 0;

            // 리스트를 계속 사용하고 싶다면:
            // 만약 리스트를 사용하고 싶다면, 리스트에 맞는 방식으로 처리하도록 코드를 수정해야 한다.
            // 예를 들어, 리스트의 요소에 접근하려면 배열이 아닌 리스트의 메서드(get() 등)를 사용해야 한다.
            if (one == computer.get(0)) {
                checkS += 1;
            } else {
                if (one == computer.get(1) || one == computer.get(2)) {
                    checkB += 1;
                }
            }

            //System.out.println("checkS"+ checkS+ "checkB"+ checkB);

            if (two == computer.get(1)) {
                checkS += 1;
            } else {
                if (two == computer.get(0) || two == computer.get(2)) {
                    checkB += 1;
                }
            }
            //System.out.println("checkS"+ checkS+ "checkB"+ checkB);

            if (thr == computer.get(2)) {
                checkS += 1;
            } else {
                if (thr == computer.get(0) || thr == computer.get(1)) {
                    checkB += 1;
                }
            }

            int t3check = 0;
            if (checkS == 3) {
                System.out.println("3스트라이크");
                System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료");
                System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.");
                con = Console.readLine();
                int tmpCon = Integer.parseInt(con);
                if (tmpCon == 2) {
                    //System.out.println("그만?");
                    exitval = 1;
                    break;
                }
                computer = new ArrayList<>();
                checkS = 0;
                t3check = 1;
            }

            if (checkS >= 1 && checkB >= 1) {
                System.out.println(checkB + "볼 " + checkS + "스트라이크");
            }

            if (checkS >= 1 && checkB == 0) {
                System.out.println(checkS + "스트라이크");
            }

            if (checkB >= 1 && checkS == 0) {
                System.out.println(checkS + "볼");
            }


            if (checkS == 0 && checkB == 0) {
                if (t3check != 1) {
                    System.out.println("낫싱");
                }
            }
            t3check = 0;


            if (exitval == 1) {
                break;
            }

        }

    }

    // 입력값의 숫자에 중복이 있는지 확인하는 메서드
    private static boolean hasDuplicateDigits(String input) {
        char[] chars = input.toCharArray();
        return chars[0] == chars[1] || chars[0] == chars[2] || chars[1] == chars[2];
    }
}

 

 

 

'Framework > Spring' 카테고리의 다른 글

Spring Core 2  (0) 2024.08.14
Spring Core 1  (0) 2024.08.14
Spring JDBC(Java Database Connectivity) 1  (0) 2024.08.12
Spring mvc 4 (MVC Configuration, View Controller, Interceptor, Argument Resolver)  (0) 2024.08.06
Spring mvc 3 (예외처리)  (0) 2024.08.05

+ Recent posts