본문 바로가기
💾 Backend/우아한 테크코스-프리코스

🛸 JUnit5, AssertJ 사용 테스트코드

by 정람지 2023. 11. 1.

🛸JUnit5 🛸

JUnit은 자바 프로그래밍 언어용 유닛 테스트 프레임워크

 

🛸AssertJ 🛸

AssertJ는 풍부한 assertions 세트와 유용한 오류 메시지를 제공하고 테스트 코드 가독성을 향상시키며, IDE내에서 매우 쉽게 사용할 수 있도록 설계된 Java 라이브러리 

JUnit에서 많이 사용됨


🛸공부!🛸

 

 

[우테코] JUnit 5와 AssertJ로 테스트코드 작성하기

Java 에서 테스트 코드를 짤 때 특정 자료구조의 원소 값을 확인해야 하는 테스트가 있다.반복문을 돌면서 일일히 확인해야 하거나 그냥 코드 한줄 한줄 입력하는 방법도 있지만 org.assertj.core.api.A

velog.io

 

🎀assertThat(결과).contains()🎀

중복여부, 순서에 관계 없이 값만 일치하면 테스트가 성공
결과에 포함되지 않은 값이 contains의 매개변수로 있으면 테스트는 실패

단, 결과의 모든 값이 contains 매개변수에 있지 않아도 됨

(즉 결과가 contains의 매개변수를 포함하고 있는지를 검사 / contains의 매개변수⊂ 결과의 값들)

 

 

 

🎀assertThat(결과).containsOnly()🎀

원소값과 갯수가 정확히 일치해야 테스트가 통과

 

원소의 순서, 중복 여부는 무시

 

🎀assertThat(결과).containsExactly()🎀

원소가 정확히 일치해야 테스트가 통과
원소의 순서, 중복 여부 중요


🛸test/java/study 공부 🛸

과제 안에 들어있는 StringTest로 공부 가능하다!

import static org.assertj.core.api.Assertions.*; // AssertJ의 다양한 API

import static org.assertj.core.api.Assertions.assertThat;//우테코파일내임포트 'assertThat'클래스
import static org.assertj.core.api.Assertions.assertThatThrownBy;//우테코파일내임포트 'assertThatThrownBy'클래스

import org.junit.jupiter.api.Test;

 

JUnit 코드의 기본 구조 - 테스트로 사용할 클래스를 만들고 @Test 어노테이션을 메서드에 붙이기!


@Test
    void split_메서드로_주어진_값을_구분() {
        String input = "1,2";
        String[] result = input.split(",");

        assertThat(result).contains("2", "1");
        assertThat(result).containsExactly("1", "2");
    }

 

- 2,1이 들어잇으면통과

-딱 1,2여야 통과


@Test
    void split_메서드_사용시_구분자가_포함되지_않은_경우_값을_그대로_반환() {
        String input = "1";
        String[] result = input.split(",");

        assertThat(result).contains("1");
    }

 

.split 오끼

- 1포함시 통과


@Test
    void substring_메서드로_특정_구간_값을_반환() {
        String input = "(1,2)";
        String result = input.substring(1, 4);

        assertThat(result).isEqualTo("1,2");
    }

 

🎀assertThat(result).isEqualTo🎀

대상의 내용 자체 일치여부 판단

 

substring()✨

start와 end로 문자열에서 골라낼 부분의 처음과 끝을 지정해 잘라옴!


@Test
    void charAt_메서드로_특정_위치의_문자_찾기() {
        String input = "abc";
        char charAtElement = input.charAt(0);
        assertThat(charAtElement).isEqualTo('a');
    }

 

✨charAt()✨


@Test
    void charAt_메서드_사용시_문자열의_길이보다_큰_숫자_위치의_문자를_찾을_때_예외_발생() {
        String input = "abc";

        assertThatThrownBy(() -> input.charAt(5))
                .isInstanceOf(StringIndexOutOfBoundsException.class)
                .hasMessageContaining("String index out of range: 5");
    }

 

🎀assertThatThrownBy🎀 -> 무조건 에러가 발생해야 한다. 에러가 발생하지 않으면 실패


🛸내 테스트코드 작성🛸

- 최종 우승자가 hamster가 되어야 통과

("ham : --", "ster : ", "cute : ", "최종 우승자 : ham"가 출력에 포함되어야 함)

(랜덤수에 4,5가 들어가서 전진,노전진 컨트롤)

@Test
    void 최종_우승자_hamster() {
        assertRandomNumberInRangeTest(
                () -> {
                    run("ham,ster,cute", "2");
                    assertThat(output()).contains("ham : --", "ster : ", "cute : ", "최종 우승자 : ham");
                },
                MOVING_FORWARD, STOP, STOP, MOVING_FORWARD, STOP, STOP
        );
    }

힝 5자 제한이라서 hamster를 못 쓰다니

 

- 시도 횟수가 -1이므로 IllegalArgumentException 에러 발생해야 통과

@Test
    void 시도횟수에_대한_예외_처리() {
        assertSimpleTest(() ->
                assertThatThrownBy(() -> runException("ham,ster,cute", "-1"))
                        .isInstanceOf(IllegalArgumentException.class)
        );
    }

굿



EDOC 후배님들과 밥약이 있어서 오랜만에~!꾸미고!! 

그동안의 폐인생활..

12만원 나왔다.. ㅎㅎ