우당탕탕 기술블로그
[회고록] 우아한 테크코스 6기 프리코스 3주차 회고 본문
목차
GitHub - hyzzzzy/javascript-lotto-6
Contribute to hyzzzzy/javascript-lotto-6 development by creating an account on GitHub.
github.com
🎰 로또 코드 구조
- 로또 구입 금액 입력
- 로또 구입 금액 유효성 검사
- 발행한 로또 수량 출력
- 발행한 로또 번호 출력
- 당첨 번호 입력
- 당첨 번호 유효성 검사
- 보너스 번호 입력
- 보너스 번호 유효성 검사
- 당첨 결과 계산
- 당첨 통계 출력
- 총 수익률 계산
- 총 수익률 출력
🎰 구현 기능 목록
- 입력 함수
- 출력 함수
- 유효성 검사 함수들
- 숫자로 이루어져 있는지?
- 자연수인지?
- 1000 이상의 숫자인지?
- 쉼표를 기준으로 6개를 입력 했는지?
- 1 이상 45 이하의 숫자로 이루어져 있는지?
- 로또 구입 금액 유효성 검사 함수
- 숫자로 이루어져 있는지? / 자연수인지? / 1000 이상의 숫자인지?
- 구매 가능한 로또 개수(N) 계산 함수
- 랜덤값 부여 함수
- 발행한 로또 결과 함수
- 1차원 배열 N개 저장
- 배열 내 오름차순 정렬
- 당첨 번호 유효성 검사 함수
- 쉼표를 기준으로 6개를 입력 했는지? / 숫자로 이루어져 있는지? / 자연수인지? / 1 이상 45 이하의 숫자로 이루어져 있는지?
- 보너스 번호 유효성 검사 함수
- 숫자로 이루어져 있는지? / 자연수인지? / 1 이상 45 이하의 숫자로 이루어져 있는지?
- 로또 당첨 계산 함수
- 3개 / 4개 / 5개 / 5개 + 보너스 볼 / 6개 일치 한 경우
- 수익률 계산 함수
- 소수점 둘째 자리에서 반올림
🎰 테스트 케이스 목록
- domain/LottoShop 클래스 테스트
- 금액 입력값 유효성 검사
- 숫자를 입력 받지 않았다면 예외가 발생해야 한다.
- 자연수를 입력 받지 않았다면 예외가 발생해야 한다.
- 1000원 단위로 입력 받지 않았다면 예외가 발생해야 한다.
- 금액을 올바르게 입력 받았다면 income을 정상적으로 설정해야 한다.
- 당첨번호 입력값 유효성 검사
- 6개의 요소를 입력 받지 않았다면 예외가 발생해야 한다.
- 숫자를 입력 받지 않았다면 예외가 발생해야 한다.
- 자연수를 입력 받지 않았다면 예외가 발생해야 한다.
- 1 이상 45 이하의 숫자를 입력 받지 않았다면 예외가 발생해야 한다.
- 중복된 번호가 있다면 예외가 발생해야 한다.
- 당첨번호를 올바르게 입력 받았다면 prizeNumber를 정상적으로 설정해야 한다.
- 보너스번호 입력값 유효성 검사
- 숫자를 입력 받지 않았다면 예외가 발생해야 한다.
- 자연수를 입력 받지 않았다면 예외가 발생해야 한다.
- 1 이상 45 이하의 숫자를 입력 받지 않았다면 예외가 발생해야 한다.
- 당첨번호에 존재하는 번호를 입력했다면 예외가 발생해야 한다.
- 보너스번호를 올바르게 입력 받았다면 bonusNumber을 정상적으로 설정해야 한다.
- 로또 생성 메서드 검사
- 지정된 숫자만큼의 로또 배열을 생성해야 한다.
- 로또 배열을 오름차순으로 정렬하여 반환해야 한다.
- 로또 당첨 통계 계산 메서드 검사
- 예상한 통계 결과와 정확히 일치해야 한다.
- 로또 총 수익률 계산 메서드 검사
- 예상한 수익률 결과와 정확히 일치해야 한다.
- 금액 입력값 유효성 검사
- domain/Lotto 클래스 테스트
- 로또 번호의 개수가 6개가 넘어가면 예외가 발생해야 한다.
- 로또 번호에 중복된 숫자가 있으면 예외가 발생해야 한다.
- utils/validation 테스트
- 숫자가 아니라면 예외가 발생해야 한다.
- 자연수가 아니라면 예외가 발생해야 한다.
- 1000단위가 아니라면 예외가 발생해야 한다.
- 6개 요소를 갖고 있지 않다면 예외가 발생해야 한다.
- 1 이상 45이하의 숫자가 아니라면 예외가 발생해야 한다.
- 중복된 수가 있다면 예외가 발생해야 한다.
- 배열에 있는 숫자가 있다면 예외가 발생해야 한다.
- utils/calculation 테스트
- 로또와 당첨번호 매칭 계산 함수 검사
- 로또와 당첨 번호 간 일치하는 번호의 개수를 반환해야 한다.
- 일치하는 번호가 없을 경우 0을 반환해야 한다.
- 로또와 보너스 번호 매칭 여부 함수 검사
- 로또에 보너스 번호가 포함되어 있을 경우 true를 반환해야 한다.
- 로또에 보너스 번호가 포함되어 있지 않을 경우 false를 반환해야 한다.
- 로또와 당첨번호 매칭 계산 함수 검사
🎰 느낀점
경험에 따라 테스트 케이스 생각하기
이번 과제에서 가장 집중했던 건 단순한 기능 테스트가 아니라 도메인 로직에서 어떤 테스트가 필요할지도 고민했던 점이다. 요구 사항에 맞게 UI 로직을 제외한 도메인 로직에 단위 테스트를 진행할 것에 집중했고, 특히 가장 작은 단위부터 점차 단위를 키워서 테스트를 작성할 것을 목표로 했다.
먼저 유효성 검사 로직을 먼저 작성해서 의도한 바대로 검증이 진행되는 지 확인하는 테스트 코드를 작성했다. 이미 제공된 테스트 케이스들이 모두 통과되길래 ‘에러 없이 잘 작성했구나’ 라고 판단했으나 잘못된 로직을 짜서 과제 기한 후반부에 가서라도 로직을 수정할 수 있는 기회가 있어서 다행이다 라는 생각이 들었다.
그 다음 로또상점(LottoShop)이라는 클래스에서 금액(income), 당첨 번호(prizeNumber), 보너스 번호(bonusNumber)를 관리해서 해당 필드가 정상적으로 설정 되는지 혹은 예외가 발생한다면 예상한 예외 상황에 맞게 에러 메세지를 던져주는 지 확인했다. 물론 유효성 검사 로직에 대한 테스트 코드를 작성한 바 있지만 실제로 도메인 로직에서도 의도한 예외 처리가 정상적으로 작동하는 지 확인하기 위해 필요하다고 생각해서 작성했다. 그치만 이 점에 대해서 테스트가 중복적이다 라는 생각이 들 수도 있을 것 같아 조금 더 공부해봐야 할 것 같다.
마지막으로 각종 로또 상점 클래스에 있는 로또 발행(createLotto)이 정상적으로 작동하는지, 로또 당첨 통계(calculateStat)를 정상적으로 계산하는지, 로또 총 수익률(calculateTotalReturn)를 정상적으로 계산하는지, 메서드 사이사이에 있는 util 함수들은 또 정상적인 결과를 반환하는지 따로 테스트 하면서, 피드백과 요구 사항에 맞게 경험에 따라 흐름에 따라 테스트 코드를 작성했다.
저번 주만 하더라도 어떤 테스트 코드를 작성해야 하는 지 굉장히 막막해서 가장 입문하기 쉬웠던 유효성 검사부터 테스트 케이스를 작성했는데 이번 경험을 통해서 어떤 테스트 케이스가 필요한지 저번보다 확신을 가지고 작성할 수 있었다.
'Project' 카테고리의 다른 글
[회고록] 우아한 테크코스 6기 프리코스 4주차 회고 (0) | 2023.11.22 |
---|---|
[회고록] 우아한 테크코스 6기 프리코스 2주차 회고 (0) | 2023.11.02 |
[회고록] 우아한 테크코스 6기 프리코스 1주차 회고 (0) | 2023.10.27 |
[회고록] 2차 프로젝트를 마치며 (0) | 2023.06.29 |
[회고록] AI 챗봇 프로젝트 스터디 1차 회고록 (0) | 2023.06.03 |