잉?

[SpringBoot] 단위 테스트(Unit Tests)는 뭔데? + 사용 이유 본문

자바(Java)/스프링부트(SpringBoot)

[SpringBoot] 단위 테스트(Unit Tests)는 뭔데? + 사용 이유

Jye_647 2023. 7. 25. 21:02

- x축이 Time

- y축이 Costs

 

1. 개발

2. 단위 테스트(Unit Test)

3. QA Testing

4. Prodiction(실 서비스 운영 환경)

 

버그를 사전에 발견하여 기하급수적인 비용의 증가가능성을 사전에 방지하기 위해 단위 테스트를 진행한다.

 

[단위 테스트? (Unit Test)]

단위 테스트는 작은 단위로 쪼개 각 단위가 정확하게 동작하는지 예상대로 동작하는지 검사 및 확인하는 테스트이다.


단위의 크기가 작을 수록 복잡성이 낮아진다. 

따라서 단위의 크기를 작게하여 최대한 간단하고 쉽게 작성해야 한다.

 

만약 방대한 코드를 가진 소프트웨어에 버그가 발생되었다.

디버깅을 통해 범위는 좁혀졌지만 어떤 클래스에 버그가 있는지 정확히 알지 못한다.

이 클래스에 버그가 있는것 같아서! 코드를 고쳤다면 분명 몇 달 뒤 기존 버그 + 새롭게 수정된 곳의 버그까지

발생될 것이다. 이러한 일들을 방지하기 위해 유닛테스트를 활용해야한다.

 

 프로그래밍 언어마다 단위 테스트에서 사용하는 프레임워크가 다르다.

Java에서는 JUnit을 사용한다.


@BeforeEach 각각의 테스트가 실행되기 전 수행
@AfterEach 각각의 테스트가 실행된 후 수행
@BeforeAll 모든 테스트가 실행되기 전 처음으로 수행
@AfterAll 모든 테스트가 실행된 후 마지막으로 수행

 

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

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

    @BeforeAll
    static void beforeAll() {
        System.out.println("모든 테스트 코드가 실행되기 전에 최초로 수행\n");
    }

    @AfterAll
    static void afterAll(){
        System.out.println("모든 테스트 코드가 수행된 후 마지막으로 수행");
    }

    @Test
    void test1(){
        System.out.println("테스트 코드 작성 1");
    }

    @Test
    void test2(){
        System.out.println("테스트 코드 작성 2");
    }


@DisplayName 테스트의 내용을 알아볼 수 있게 네이밍 해준다.
@Nested 주제 별로 그룹짓기
@Order 테스트를 단위별로 순서를 매길때 사용.
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
붙여줘야 한다.
 @Test
    @DisplayName("테스트의 내용을 한눈에 알아볼 수 있게 네이밍 해줄 때")
    void test1(){
        System.out.println("테스트 내용 빠르게 파악");
    }

    @Nested
    @DisplayName("주제 별로 테스트를 그룹지어서 파악하기 좋습니다.")
    @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
    class Test1 {
        @Order(1)
        @Test
        @DisplayName("Test1 클래스")
        void test() {
            System.out.println("\nTest1 클래스");
        }

        @Order(3)
        @Test
        @DisplayName("Test1 - test1()")
        void test1() {
            System.out.println("Test1.test1");
        }

        @Order(2)
        @Test
        @DisplayName("Test1 - test2()")
        void test2() {
            System.out.println("Test1.test2");
        }
    }


Given - When - Then 패턴  

- 테스트 코드 스타일 중 하나이다.

- [ 준비 - 실행 - 검증 ]로 보면 이해하기 쉽다.

 

Given  테스트에 필요한 변수, 값을 선언
When   테스트하고자 하는 액션을 실제로 실행
Then  발생할거라 예상되는 결과를 검증

 

  @Test
    @DisplayName("계산기 연산 성공 테스트")
    void test1() {
        // given
        int num1 = 5;
        String op = "/";
        int num2 = 2;

        // when
        Double result = calculator.operate(num1, op, num2);

        // then
        assertNotNull(result);
        assertEquals(2.5, result);
    }

*참고

 

그래서 유닛테스트(Unit Test)가 뭔가요?

소프트웨어 업계에 종사하거나 개발을 많이 해봤다면 유닛테스트에 대해 종종 들었을 것이다. 업계에 종사하고있다면 실제로 유닛테스트를 매일 작성하고 있을수도 있다. 유닛테스트는 뭘까?

imasoftwareengineer.tistory.com

 

Comments