본문 바로가기

우테코

우테코 2주차 - [자동차 경주] : TDD 작성

기능을 모두 구현하고 난 이후에는

Application Test 이외에 TDD를 몇가지 테스트하며

구현한 함수가 제대로 작동하는지 테스트해보았다.

 

TDD에 아직 익숙하지 않은 만큼

먼저 다음 링크의 블로그를 통해 Junit test code 작성법을 익혔다.

 

=> 참고한 링크들

https://velog.io/@jkijki12/Java-TDD

 

[Java] TDD 어떻게 하는가?

TDD가 무엇이냐!!!!! 왜 자꾸 내눈에 보이는 것이냐!!!

velog.io

 

https://juhi.tistory.com/58

 

[TDD 공부-java] 3) 예외 처리

새로 배운 annotation @DisplayName(""): 테스트에 표시 이름을 붙이는 annotation @Disabled : 특정 테스트를 실행하고 싶지 않을 때 @ParameterizedTest + @ValueSource test메소드에 파라미터 값을 넣어준다. → 즉 여러

juhi.tistory.com

 

 

=> 다음으로 test/study 파일을 통해 각 의미를 공부해보았다.

 

1. contains/ containsExcatly

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

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

.contains()  결과값이 이 값들을 포함하는지 확인

.containsExactly() : 순서를 포함해서 일치하는지 확인

 

참고 

:https://bcp0109.tistory.com/317

 

JUnit 에서 AssertJ 로 contains 포함 여부 테스트

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

bcp0109.tistory.com

 

2. asserThat().isEqualTo()

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

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

.isEqualTo() : 결과값이 같은지 확인할 때 

 

 

3. 이 값을 던졌을 때 예외값이 출력되는지

assertThatThrwonBy()

.isInstanceOf()

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

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

 

=> 이 코드에서는 길이가 3인 input("abc")에서

=> charAt(5)를 입력했을 때 StringIndexOutofBOundsException 오류가 나오는지 확인

=> 그 오류에는 String index out of Index가 포함되어 있는지 확인

 


>> 구현한 TDD

 

1) 자동차 객체가 제대로 초기화되는지

@Test
    void Car객체_초기화(){
        Car car=new Car("geonwoo");
        assertEquals(car.getName(), "geonwoo");
        assertEquals(car.getPosition(),0);
    }

=> 멤버함수가 geonwoo로 초기화되고

=> position에는 0이 초기화되는지 확인

 

2) 자동차 이름 input 값의 예외상황들 test

- 쉼표로 끝날때

- 입력값이 없을 때

- 중복된 입력값이 있을때

- 5글자보다 긴 입력값이 있을 때

- 빈 입력값이 있을 때

- 형식이 잘못된 이름이 있을때

   @Test
    void End_Delimiter_Test() {
        assertThrows(IllegalArgumentException.class, ()-> {
            NameValidiator check = new NameValidiator("java,");
        });
    }

    @Test
    void Blank_Test() {
        assertThrows(IllegalArgumentException.class, ()-> {
            NameValidiator check = new NameValidiator("");
        });
    }

    @Test
    void check_Duplicate() {
        assertThrows(IllegalArgumentException.class, ()-> {
            InputNames check = new InputNames();
            check.ParsingInput("java,java");
        });
    }

    @Test
    void check_Long_Names() {
        assertThrows(IllegalArgumentException.class, ()-> {
            InputNames check = new InputNames();
            check.ParsingInput("javaji,java");
        });
    }

    @Test
    void check_Empty_Names() {
        assertThrows(IllegalArgumentException.class, ()-> {
            InputNames check = new InputNames();
            check.ParsingInput("j,,java");
        });
    }

    @Test
    void check_Wrong_Names() {
        assertThrows(IllegalArgumentException.class, ()-> {
            InputNames check = new InputNames();
            check.ParsingInput("#,#");
        });
    }

=> 각 상황에서 IllegalArgumentException을 발생시키는지 확인

 

 

3) 턴수 input 값의 예외상황들 test

- 입력값이 숫자가 아닐때 : "a"

- 입력값이 적법한 형식이 아닐때 : "123,"

- 입력값이 0일 때

- 입력값이 음수일 때

 

  @Test
    void check_Not_Number1() {
        assertThrows(IllegalArgumentException.class, ()-> {
            InputTurn check = new InputTurn();
            check.inputToInt("a");
        });
    }

    @Test
    void check_Not_Number2() {
        assertThrows(IllegalArgumentException.class, ()-> {
            InputTurn check = new InputTurn();
            check.inputToInt("123,");
        });
    }

    @Test
    void check_Zero() {
        assertThrows(IllegalArgumentException.class, ()-> {
            InputTurn check = new InputTurn();
            check.inputToInt("0");
        });
    }

    @Test
    void check_Negative_Number() {
        assertThrows(IllegalArgumentException.class, ()-> {
            InputTurn check = new InputTurn();
            check.inputToInt("-1");
        });
    }

 

 

=> 실행결과 : 다행히 모두 통과했다!!

 


 

>>느낀 점

 

- study 파일을 통해 TDD작성의 의의와 효과를 파악할 수 있었다.

- TDD 작성을 위한 JUnit 코드들을 학습하고 이를 입력값에 적용해보았다.

- 기능이 모두 구현되고 난후 TDD를 시행하여 private 함수를 몇개 public으로 바꾸어주어야 했다.

- 기능이 하나하나 구현될때마다 Test Case를 바로바로 작성하여 테스트하는 습관이 더 중요하다 생각했다.

=> 어디서 오류가 난지 찾는 기능이 아니라, 말 그대로 기능 자체가 잘 돌아가는지 test하는 데 의의가 있으므로