실험1: main 기반 검증의 한계

케이스가 늘어나니 어디를 수정해야 했는가?

  • 사실: 케이스를 6개로 늘리니, main에서 사용자 입력값을 받는 부분을 수정해야 했다.
  • 문제: 사용자 입력값에 대한 유효성 검증을 하지 않았다.

수정하면서 놓친 것은 없는가?

  • 사실: Ace 숫자 계산 메서드에 유효하지 않은 값이 들어가면 예외를 던지지 않는다.
  • 문제: 메서드 안에서 사용자 입력값에 대해 유효성 검사를 해주지 않아 발생하는 문제이다.

→ 그렇다면 어디까지 유효성 검사를 해줘야할까?

이전 케이스가 여전히 동작하는지 어떻게 확인했는가?

  • 사실: 이전 테스트 케이스가 잘 동작하는지 직접 실행하며 확인했다.
  • 문제: 테스트 케이스가 3개에서 6개로 늘어나니 너무 귀찮았다.

<br>

실험2: 테스트 코드 작성

테스트를 작성하기 어려운 코드가 있는가?

  • main에서 사용자의 입력값을 검증하는 테스트 코드가 작성하기 어려웠습니다.

어렵다면, 무엇 때문에 어려운가?

  • 실제 사용자의 입력을 입력받는 부분을 어떻게 테스트 해야할지 어려웠다.

테스트를 쉽게 하려면 코드를 어떻게 바꾸고 싶은가?

  • 입력을 받는 부분은 그대로 두고, 입력값의 유효성을 검증하는 부분을 메서드로 분리하여 사용자 입력값이 임의로 들어왔다 가정하여 테스트 코드를 짜도록 바꾸고싶다.

테스트가 어려웠던 코드 1곳

System.out.println("0부터 21 사이의 숫자를 입력해주세요...");
int total = Integer.parseInt(br.readLine());
if (!(0 <= total && total <= 21)) {
       throw new IllegalArgumentException();
}

바꾸고 싶은 부분과 이유

  • 바꾸고 싶은 부분
if (!(0 <= total && total <= 21)) {
       throw new IllegalArgumentException();
}
  • 이유

이유는 2가지가 있습니다. 첫 번째는 테스트 코드 작성의 어려움입니다. 하나의 main 메서드 안에 여러 로직이 합쳐져 있어 하나의 조건에 대해 테스트 하려면 모든 로직을 검증해야 합니다. 현재 main 메서드의 큰 흐름은, 사용자 입력값 입력, 사용자 입력값 유효성 검증, Ace 값 결정, Ace 값 출력으로 되어있습니다. 이때, 사용자 입력값 입력과 유효성 검증 로직이 강하게 결합되어 있어 테스트 코드를 작성하는데 어려움을 겪었습니다.

두 번째는 가독성 저하입니다. 현재 위의 코드는 사용자 입력값의 유효성을 검증한다는 의미를 담고 있습니다. 하지만 제3자가 보았을 때는 이를 단번에 알아보기 어렵습니다. 따라서 이를 메서드로 분리하여 vaidate() 와 같이 표시해준다면, 의미와 의도가 명확한 코드가 될 것 같습니다.

이 2가지 이유로, 위의 코드를 유효성 검증 메서드로 분리하고 싶습니다.

<br>

산출물

  • 관찰 기록
  • 테스트 단위에 대한 내 의견