TIL

테스트 관련 어노테이션, Given - When - Then 패턴

우성팔 2023. 11. 30.

소프트웨어공학을 공부할 때 나왔었던 단위 테스트에 대해서 알아보았다

 

 

단위 테스트

테스트 생성이 끝나고 수행하는 첫 번째 테스트로 프로그램의 기본 단위인 모듈을 테스트하여 모듈테스트(module test) 라고도 하며 작성한 코드 중 실행 가능한 가장 작은 단위를 테스트하는 것을 단위 테스트라고 한다

메서드 단위로 테스트 하는 것

더보기

 

소프트웨어공학으로 바라봤을 때의 단위테스트

+ 구현 단계에서 각 모듈의 개발을 완료한 후 개발자가 요구분석명세서대로 정확히 구현되었는지 테스트

+ 개별 모듈이 제대로 구현되어 정해진 기능을 정확히 수행하는지를 테스트

 

 

단위 테스트 수행 후 발견되는 오류

 

- 잘못 사용한 자료형
- 잘못된 논리 연산자
- 알고리즘 오류에 따른 원치 않는 결과
- 틀린 계산 수식에 의한 잘못된 결과
- 탈출구가 없는 반복문의 사용

 

자바 언어용 단위 테스트 프레임워크인 JUnit5를 사용하여 JAVA에서 단위 테스트를 실행할 수 있습니다

 


단위 테스트 관련 어노테이션

더보기

 

@BeforeEach

각각의 테스트 코드실행되기 전에 수행되는 메서드를 만들어줌

 

@AfterEach

각각의 테스트 코드실행된 후에 수행되는 메서드를 만들어줌

 

@BeforeAll

모든 테스트 코드수행되기 전에 최초로 수행되는 메서드를 만들어줌(static 메서드로 만들어야 함)

 

@AfterAll

모든 테스트 코드수행된 후 마지막으로 수행되는 메서드를 만들어줌(static 메서드로 만들어야 함)

 

 

 

@DisplayName

- 테스트의 내용을 쉽게 알아볼 수 있게 네이밍 해줄 수 있음

 

@Nested

- 주제 별로 테스트를 그룹 지어서 파악하기 좋음

 

@Order

- 테스트를 메서드 단위로 순서를 매길 때 @TestMethodOrder(MethodOrderer.OrderAnnotation.class) 어노테이션 설정을 해야 함
- 그다음 원하는 순서에 맞게 메서드에 @Order(순서에 해당하는 숫자) 어노테이션을 추가

 

 

 

@RepeatedTest

@RepeatedTest(value = 5, name = "반복 테스트 {currentRepetition} / {totalRepetitions}")
    void repeatTest(RepetitionInfo info) {
        System.out.println("테스트 반복 : " + info.getCurrentRepetition() + " / " + info.getTotalRepetitions());
    }

 

- 해당 테스트 메서드를 반복할 수 있음
- name 속성을 사용하여 네이밍 할 수 있
- RepetitionInfo 값을 파라미터로 받아서 현재 반복 횟수와 총 횟수 값을 확인할 수 있

 

@ParameterizedTest

@ParameterizedTest
    @ValueSource(ints = {1, 2, 3, 4, 5, 6, 7, 8, 9}) // 들어있는 수만큼 수를 넣어서 실행
    void parameterTest(int num) {
        System.out.println("5 * num = " + 5 * num);
    }

 

- 파라미터를 받아 테스트할 수 있는 메서드를 만들 수 있음
- @ValueSource(ints = {1, 2, 3, 4, 5, 6, 7, 8, 9})를 사용하여 파라미터 값을 전달할 수 있음
    - 전달되는 파라미터 수만큼 테스트 메서드가 수행됨
    - int, String 등 여러 타입의 파라미터를 전달할 수 있음

 

이 사이트에 어노테이션에 대해서 영문으로 자세하게 나와있다

https://junit.org/junit5/docs/current/user-guide/#writing-tests-annotations

 

JUnit 5 User Guide

Although the JUnit Jupiter programming model and extension model do not support JUnit 4 features such as Rules and Runners natively, it is not expected that source code maintainers will need to update all of their existing tests, test extensions, and custo

junit.org

 


Given - When - Then

Given - When - Then은 Test Code 스타일을 표현하는 방식

현업에서도 많이 사용하는 방식이라고 한다!

 

Given

  • 테스트하고자 하는 대상을 실제로 실행하기 전에 테스트에 필요한 값(상태)을 미리 선언

When

  • 테스트 하고자하는 대상을 실제로 실행

Then

  • 어떤 특정한 행동(테스트 대상 실행) 때문에 발생할 거라고 예상되는 결과에 대해 예측하고 맞는지 확인

 

한마디로 준비 실행  → 검증 이라고 보면 될 것 같다

 

 

 

EX) Calculator.java

더보기
public class Calculator {
    public Double operate(double num1, String op, double num2) {
        switch (op) {
            case "*":
                return num1 * num2;
            case "/":
                if (validateNum(num2)) {
                    return num1 / num2;
                } else {
                    return null;
                }
            case "+":
                return num1 + num2;
            case "-":
                return num1 - num2;
            default:
                throw new IllegalArgumentException("잘못된 연산자입니다.");
        }
    }

    public boolean validateNum(double num) {
        if (num == 0) {
            return false;
        } else {
            return true;
        }
    }
}

 

@Test
    @DisplayName("계산기 연산 실패 테스트 : 분모가 0일 경우")
    void test1_1() {
        // given
        int num1 = 5;
        String op = "/";
        int num2 = 0;

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

        // then
        assertNull(result);
    }

'TIL' 카테고리의 다른 글

[JPA] 값 타입 컬렉션  (0) 2023.12.06
JUnit Assert(단정) 메서드  (2) 2023.12.04
2023-11-23 TIL  (0) 2023.11.23
2023-11-21 TIL  (0) 2023.11.21
2023-11-16 TIL  (1) 2023.11.16

댓글