- 이 글은 자바지기(박재성)님의 강의를 개인적인 공부를 위해 정리한 글입니다.
- 우아한테크세미나_TDD 리팩토링
📖 1단계 - 단위 테스트 연습
- 내가 사용하는 API 사용법을 익히기 위한 학습 테스트에서 시작
- String 클래스에 대한 학습 테스트
- Set Collection에 대한 학습 테스트
- 구현하는 메소드(함수) 중 Input과 Output이 명확한 클래스 메소드(보통 Util 성격의 메소드) 에 대한 단위 테스트 연습
우선 단위 테스트 연습을 하기 위해서는 Test 폴더를 만들어야 한다.
이 글에서는 Test 폴더를 만드는 것이 주 내용이 아니므로 인텔리제이로 테스트 폴더를 만드는 것이 잘 설명된 글을 첨부한다.
자바 String 클래스의 다양한 메소드(함수) 사용법
1) "1,2"을 ,로 split 했을 때 1과 2로 잘 분리되는지 확인하는 학습 테스트를 구현
@Test는 해당 메소드가 단위 테스트임을 명시하는 어노테이션이다. JUnit은 테스트 패키지 하위의 @Test 어노테이션이 붙은 메소드를 단위 테스트로 인식하여 실행시킨다.
이 상태로 실행하면 테스트 이름이 함수 이름이 default로 지정되는데, 우리는 @DisplayName 어노테이션을 사용하여 읽기 좋은 다른 이름을 부여할 수 있다.
만약 여기서 "1", "2" 가 아니라 "1", "3" 즉 결과값이 아닌 문자열을 테스트 했다면
이와 같이 우리는 ["1", "2"] 를 기대했는데 ["1", "3"] 이 나와서 이 테스트는 실패했다. (Test failed)
가 뜨는 것을 확인할 수 있다.
2) "1"을 ,로 split 했을 때 1만을 포함하는 배열이 반환되는지에 대한 학습 테스트를 구현
여기서 우리는 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() 메소드를 활용해 특정 위치의 문자를 가져오는 학습 테스트를 구현
4) 연속한 메소드를 메소드체이닝으로 구현하는 테스트
'JAVA with TDD, Clean Code' 카테고리의 다른 글
JAVA(자바) 단위 테스트 실습 - 숫자야구게임 구현 (0) | 2021.09.17 |
---|---|
JAVA(자바) 단위 테스트 실습 - 문자열 계산기 (0) | 2021.09.03 |
간단한 클래스 분리 (0) | 2021.08.21 |
JUnit, AssertJ, 단위테스트 개념 및 다양한 활용법 (0) | 2021.08.04 |
Set Collection에 대한 학습 테스트 (0) | 2021.07.30 |