학습 테스트 목적
자신이 사용할 API나 프레임워크의 기능을 테스트하면서 사용 방법을 익히려는 것이다.
String 클래스에 대한 학습 테스트
요구사항 1
- “1,2”를
,로 split 했을 때 1과 2로 잘 분리되는지 확인하는 학습 테스트를 구현한다. - “1”을
,로 split 했을 때 1만을 포함하는 배열이 반환되는지 확인하는 학습 테스트를 구현한다.
힌트
- 배열로 반환하는 값은 AssertJ의
contains()를 활용해 반환 값이 맞는지 검증한다. - 배열로 반환하는 값은 AssertJ의
containsExactly()를 활용해 반환 값이 정확히 일치하는지 검증한다.
contains와 containsExactly 메서드 설명
contains
- 순서와 중복 여부 무시: 요소의 순서나 중복 여부에 관계없이 지정된 값이 포함되어 있는지만 확인한다.
containsExactly
- 순서와 중복 여부 고려: 요소의 순서와 중복까지 정확히 일치해야 테스트가 성공한다.
테스트 코드
@Test
void 여러값_문자열_분리_테스트() {
//given
String input = "1,2";
//when
List<String> result = Arrays.asList(input.split(","));
//then
assertThat(result).contains("1", "2");
}
@Test
@RepeatedTest(5)
void 여러값_문자열_분리_순서보장_테스트() {
//given
String input = "1,2";
//when
List<String> result = Arrays.asList(input.split(","));
//then
assertThat(result).containsExactly("1", "2");
}
@Test
void 단일값_문자열_분리_테스트() {
//given
String input = "1";
//when
List<String> result = Arrays.asList(input.split(","));
//then
assertThat(result).containsExactly("1");
}
요구사항 2
“(1,2)” 값이 주어졌을 때 String의 substring() 메소드를 활용해 괄호 ()를 제거하고 “1,2”를 반환하도록 구현한다.
테스트 코드
@Test
void substring_괄호제거_문자열반환() {
//given
String input = "(1,2)";
//when
String result = input.substring(1, input.length() - 1);
//then
assertThat(result).isEqualTo("1,2");
}
요구사항 3
- “abc” 값이 주어졌을 때 String의 charAt() 메소드를 활용해 특정 위치의 문자를 가져오는 학습 테스트를 구현한다.
- String의 charAt() 메소드를 활용해 특정 위치의 문자를 가져올 때 위치 값을 벗어나면
StringIndexOutOfBoundsException이 발생하는 부분에 대한 학습 테스트를 구현한다. - JUnit의 @DisplayName을 활용해 테스트 메소드의 의도를 드러낸다.
[[codingPractices] JUnit5 테스트 코드 작성법](https://velog.io/@grayson1999/codingPractices-JUnit5-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1%EB%B2%95)
테스트 코드
@DisplayName("charAt() 문자열의 특정위치 문자반환 테스트")
@Test
void 문자열_특정위치_문자값_반환_테스트() {
//given
String input = "abc";
//when
char first_value = input.charAt(0);
char last_value = input.charAt(input.length() - 1);
//then
assertThat(first_value).isEqualTo('a');
assertThat(last_value).isEqualTo('c');
}
@DisplayName("charAt() 범위 밖 문자열 접근 테스트")
@Test
void 범위_밖_문자열_접근_테스트() {
//given
String input = "abc";
//when
Throwable thrown = catchThrowable(() -> input.charAt(input.length()));
//then
assertThat(thrown).isInstanceOf(StringIndexOutOfBoundsException.class)
.hasMessageContainingAll("Index 3", "length 3");
}
Set Collection에 대한 학습 테스트
다음과 같은 Set 데이터가 주어졌을 때 요구 사항을 만족해야 한다.
public class SetTest {
private Set<Integer> numbers;
@BeforeEach
void setUp() {
numbers = new HashSet<>();
numbers.add(1);
numbers.add(1);
numbers.add(2);
numbers.add(3);
}
// Test Case 구현
}
요구사항 1
Set의 size() 메소드를 활용해 Set의 크기를 확인하는 학습 테스트를 구현한다.
@DisplayName("setSize() set의 크기 확인 테스트")
@Test
void Set_크기_확인_테스트() {
//when
int setSize = numbers.size();
//then
assertThat(setSize).isEqualTo(3);
}
요구사항 2
Set의 contains() 메소드를 활용해 1, 2, 3의 값이 존재하는지를 확인하는 학습 테스트를 구현한다.
[[codingPractices] Parameterized Tests 사용법](https://velog.io/@grayson1999/codingPractices-Parameterized-Tests-%EC%82%AC%EC%9A%A9%EB%B2%95)
테스트 코드
@BeforeEach
void setUp() {
numbers = new HashSet<>();
numbers.add(1);
numbers.add(1);
numbers.add(2);
numbers.add(3);
}
@DisplayName("setSize() set의 크기 확인 테스트")
@Test
void Set_크기_확인_테스트() {
//when
int setSize = numbers.size();
//then
assertThat(setSize).isEqualTo(3);
}
@Test
void set_특정값_존재하는지_확인_테스트() {
//when
final int ONE = 1;
final int TWO = 2;
final int THREE = 3;
//then
assertThat(numbers.contains(ONE)).isTrue();
assertThat(numbers.contains(TWO)).isTrue();
assertThat(numbers.contains(THREE)).isTrue();
}
@ParameterizedTest(name = "{index} - {0}은 numbers에 포함됨")
@ValueSource(ints = {1, 2, 3})
void parameterizedTest_활용한_set_특정값_존재하는지_확인_테스트(int input) {
assertThat(numbers.contains(input)).isTrue();
}
요구사항 3
요구사항 2는 contains 메소드 결과 값이 true인 경우만 테스트할 수 있다.
입력 값에 따라 결과 값이 다른 경우에 대한 테스트도 가능하도록 구현한다.
테스트 코드
@ParameterizedTest(name = "{0}은 numbers에 포함됨")
@CsvSource({"1,true", "2,true", "3,true", "4,false", "5,false"})
void parameterizedTest_활용한_set_특정값_존재하는지_확인_테스트(int input, Boolean expected) {
//when
assertThat(numbers.contains(input)).isEqualTo(expected);
}