-
- JavaNextStep - 숫자야구게임(1) - 단위테스트언어/JAVA 2023. 7. 10. 17:10
- 학습테스트
> 내가 만든 api를 테스트하는게 아니라, 다른 사람이 구현해 놓은 라이브러리가 어떻게 동작하는지 단위테스트를 통해 알아보는 것 학습테스트이다.
> 새로운 라이브러리를 테스트 기반으로 할 수 있다. (빠르게 학습 가능해진다)
> 학습 테스트를 통해
- 단위 테스트 방법 학습
- 단위 테스트 도구 사용법 익힐 수 있다.
- 사용하는 API에 대한 학습 효과가 있다.
1. String 클래스에 대한 학습 테스트
1.1 요구사항 1에 대해
@DisplayName("split Test") @Test void splitTest(){ String[] input = "1,2".split(","); assertThat(input).contains("1","2"); } @Test void splitTest2(){ String[] input ="1".split(","); assertThat(input.length).isEqualTo(1); assertThat(input).containsExactly("1"); }
*배열에 대한 검사 contains에 대해 배움
1.2 요구사항 2에 대해
@Test void subStringTest3(){ String input = "(1,2)"; assertThat(input.substring(1,input.length()-1)).isEqualTo("1,2"); }
1.3 요구사항 3에 대해
@DisplayName("charAt메소드 테스트, 위치 값 벗어나면, Exception 발생하는지 Test")@Test void CharAttest(){ String input ="abc"; for(int i=0; i<input.length();i++){ assertThat(input.charAt(i)).isEqualTo("abc".charAt(i)); } assertThatThrownBy( () -> { input.charAt(4); } ).isInstanceOf(StringIndexOutOfBoundsException.class); }
* AssertJ Exception Assertions에 대해 배움
- assertThatThrownBy(() -> {
예외를 발생 시킬 수 있는 코드 (try영역)
}).isInstanceOf(Exception.class) // 예외검사 -> catch영역
.hasMessageContaining("errorMessage") -> error메시지 확인
- assertThatExceptionOfType(Exception.class)
.isThrownBy( () -> {
//error 발생 가능 코드 영역 (try)
}).withMessageMatching();
> 자주 발생하는 Exception은 별도의 메서드 제공한다.
https://joel-costigliola.github.io/assertj/assertj-core-features-highlight.html#exception-assertion
2. Set Collection에 대한 테스트
2.1 요구사항 1
@DisplayName("중복제거된 사이즈확인") @Test void sizeTest(){ assertThat(numbers.size()).isEqualTo(3); }
2.2 요구사항 2
@DisplayName("set Contain test") @Test void ContainTest(){ assertThat(numbers.contains(1)).isTrue(); assertThat(numbers.contains(2)).isTrue(); assertThat(numbers.contains(3)).isTrue(); }
변화
@DisplayName("set Parameterized Tests") @ParameterizedTest @ValueSource(ints = {1,2,3}) void PramTest(int number){ assertThat(numbers.contains(number)).isTrue(); }
@ParameterizedTest에 대해 배움
-매개변수를 줄 수 있는 Test
- ValueSource는 기본형 타입 배열을 속성으로 넣을 수 있다.
- 파라미터 갯수에 맞게 PramTest메서드를 실행하고, 각 시행시마다 파라미터를 달리한다.
- CsvSource, NullSource 등을 통해 다양한 파라미터를 넣을 수 있다.
요구사항 3
@DisplayName("set Parameterized Tests with CsvSource") @ParameterizedTest @CsvSource(value = {"1,true","2,true","3,true","4,false","5,false"}) void CsvSourceTest(String input, String expected){ int inputNumber = Integer.parseInt(input); boolean expecte = Boolean.parseBoolean(expected); assertThat(numbers.contains(inputNumber)).isEqualTo(expecte); }
@CsvSource에 대해 배움
- 기본 CsvSource를 사용하면 파라미터와 각 파라미터에 대한 결과를 따로 따로 설정해서 테스트 할 수 있다.
- 즉 입력값에 따라 결과 값이 다른 경우에 대한 테스트를 진행할 수 있다.
- 위와 같이 ,로 구분하여 CsvSource를 제공할 수도 있고, delimiter 속성을 통해 구분자를 넣을 수도 있다.
- 소스 뿐 아니라 @CsvFileSource을 통해 동일하게 테스트 할 수 있다.
@DisplayName("set Parameterized Test with CsvFiles") @ParameterizedTest @CsvFileSource(files = "src/test/java/study/data.csv", numLinesToSkip = 1) void CsvFilesTest(String input, String expected){ int inputNumber = Integer.parseInt(input); boolean expecte = Boolean.parseBoolean(expected); assertThat(numbers.contains(inputNumber)).isEqualTo(expecte); }
CsvFileSource 에 files는 프로젝트 폴더로 부터 시작한 파일 경로
resources는 resources폴더 부터 시작한 파일 경로 의미한다.
참고자료:
https://edu.nextstep.camp/s/RFY359FE
https://www.baeldung.com/parameterized-tests-junit-5
https://joel-costigliola.github.io/assertj/assertj-core-features-highlight.html#exception-assertion
'언어 > JAVA' 카테고리의 다른 글
스트림(2) - 중간 처리 (0) 2023.07.14 스트림(1) - 스트림이란,리소스로 스트림 얻기 (0) 2023.07.14 -JavaNextStep (1) - Junit (0) 2023.07.10 중첩 선언과 익명 객체 (0) 2023.07.07 상속,동적생성 (0) 2023.07.06