728x90


 

📖  1단계 - 단위 테스트 연습

  1. 내가 사용하는 API 사용법을 익히기 위한 학습 테스트에서 시작
    • String 클래스에 대한 학습 테스트
    • Set Collection에 대한 학습 테스트
  2. 구현하는 메소드(함수) 중 Input과 Output이 명확한 클래스 메소드(보통 Util 성격의 메소드) 에 대한 단위 테스트 연습

 

우선 단위 테스트 연습을 하기 위해서는 Test 폴더를 만들어야 한다.

이 글에서는 Test 폴더를 만드는 것이 주 내용이 아니므로 인텔리제이로 테스트 폴더를 만드는 것이 잘 설명된 글을 첨부한다.

※ 인텔리제이로 테스트 폴더 만들기

 

IntelliJ IDEA에 JUnit 추가하기 / 테스트 코드 작성

IntelliJ IDEA에서 JUnit을 추가하고 테스트 코드를 작성해보자. 아래 코드는 Java의 메서드 오버로딩 예제 코드이다. Main.java public class Main { public static void main(String arg []){ Multiplier multip..

ildann.tistory.com

 

 

 


 

 

 

자바 String 클래스의 다양한 메소드(함수) 사용법

 

1) "1,2"을 ,로 split 했을 때 1과 2로 잘 분리되는지 확인하는 학습 테스트를 구현

 

 

 

@Test는 해당 메소드가 단위 테스트임을 명시하는 어노테이션이다. JUnit은 테스트 패키지 하위의 @Test 어노테이션이 붙은 메소드를 단위 테스트로 인식하여 실행시킨다.

이 상태로 실행하면 테스트 이름이 함수 이름이 default로 지정되는데, 우리는 @DisplayName 어노테이션을 사용하여 읽기 좋은 다른 이름을 부여할 수 있다.

 

 

@DisplayName 을 이용해 이름 붙이기

 

 

만약 여기서 "1", "2" 가 아니라 "1", "3" 즉 결과값이 아닌 문자열을 테스트 했다면 

 

("1", "2") 가 아닌 ("1", "3") 을 테스트

 

오류발생

 

 

 

이와 같이 우리는 ["1", "2"] 를 기대했는데 ["1", "3"] 이 나와서 이 테스트는 실패했다. (Test failed) 

가 뜨는 것을 확인할 수 있다.

 

 

 

 


 

 

 

2)  "1"을 ,로 split 했을 때 1만을 포함하는 배열이 반환되는지에 대한 학습 테스트를 구현

 

@DisplayName 을 이용해 이름 붙이기

 

 

여기서 우리는 contains와 contaisExactly의 차이가 무엇인지 궁금할 수 있다.

 

 

 

contains

일반 contains 메소드는 단순하다. 중복여부, 순서에 관계 없이 값만 일치하면 테스트가 성공.

void containsTest() {
    List<Integer> list = Arrays.asList(1, 2, 3);

    // Success: 모든 원소를 입력하지 않아도 성공
    assertThat(list).contains(1, 2);

    // Success: 중복된 값이 있어도 포함만 되어 있으면 성공
    assertThat(list).contains(1, 2, 2);

    // Success: 순서가 바뀌어도 값만 맞으면 성공
    assertThat(list).contains(3, 2);

    // Fail: List 에 없는 값을 입력하면 실패
    assertThat(list).contains(1, 2, 3, 4);
}

 

 

 


 

 

contaisExactly

containsExactly 는 원소가 정확히 일치해야 한다.

중복된 값이 있어도 안되고 순서가 달라져도 안된다.

특정 자료구조의 정확한 값을 테스트 하고 싶은 경우에는 이 메소드를 사용할 수 있다.

@Test
void containsExactlyTest() {
    List<Integer> list = Arrays.asList(1, 2, 3);

    assertThat(list).containsExactly(1, 2, 3);
    
 // assertThat(list).containsExactly(1, 2);       -> 원소 3 이 일치하지 않아서
 // assertThat(list).containsExactly(3, 2, 1);    -> list 의 순서가 달라서 실패
 // assertThat(list).containsExactly(1, 2, 3, 3); -> list 에 중복된 원소가 있어서 실패
}

 

 

 


 

 

containsOnly 

또한 이것 두개 말고도 containsOnly 역시 알아두고 가자.

containsOnly 는 원소의 순서, 중복 여부 관계 없이 값만 일치하면 된다.

contains 와 다른 점은 들어있는 원소값은 정확히 일치해야 한다는 점이다.

@Test
void containsOnlyTest() {
    List<Integer> list = Arrays.asList(1, 2, 3);

    assertThat(list).containsOnly(1, 2, 3);
    assertThat(list).containsOnly(3, 2, 1);
    assertThat(list).containsOnly(1, 2, 3, 3);
    
 // assertThat(list).containsOnly(1, 2);       -> 원소 3 이 일치하지 않아서 실패
 // assertThat(list).containsOnly(1, 2, 3, 4); -> 원소 4 가 일치하지 않아서 실패
}

 

 

 


 

 

 

3) "abc" 값이 주어졌을 때 String의 charAt() 메소드를 활용해 특정 위치의 문자를 가져오는 학습 테스트를 구현

 

 

@DisplayName 을 이용해 이름 붙이기

 

 

 

 

4) 연속한 메소드를 메소드체이닝으로 구현하는 테스트 

메소드1( ) . 메소드2( ) ...... 이런식으로 메소드 체이닝 가능

 

 

 

 

 

복사했습니다!