세상에 나쁜 테스트는 있다.

Today I Learned 날짜 2023년 11월 24일 금요일 내용 테스트 코드 실행과 관련해서 Docker 내에서 실행해보라는 조언이 있어서 실행했다. 약간의 에러만 해결한 이후, 빠르게 테스트 코드 작성에 들어갈 수 있었다. Docker 내 실행 환경변수 건드리지말고 docker-compose exec 로 도커내에서 실행해보라는 태용님의 조언이 있었다. docker-compose exec service이름 실행내용 -v 을 통해 review 컨테이너 내에서 pytest를 진행했다. 하지만 오류로 테스트가 진행되지 않았다. 오류는 안뜨고 5성공, 5실패가 뜬다. 테스트 코드 작성 test_setup reviews_id 가 NOT NULL 인데 안들어가는 걸로 파악했다. Factory로 만들어진 review들의 id값을 확인할 수 있도록 코드를 수정했더니 모두 null값이 들어가 있었다. Factory 파일에선, Product는 id값을 1씩 증가하도록 배정해준반면 review에는 그러한 코드가 없었다. 둘다 모델 설정에는 BigInteger 이자 primary_key, index, unique로 지정되어있다. primary key가 True라면 자동으로 배정되야 하는지 나중에 찾아보자! 일단 factory처럼 증가하는 숫자를 넣었다. ⇒ 통과! test_get_widget 테스트 함수에서 parameter로 없는 것이 작성되어 있었다. 실제로 저 메서드를 찾아가보니 없길래 테스트 코드에서도 삭제해주었다. type으로 들어간 값은 schemas 파일에서 클래스를 가져와 그중 1개를 선택하도록 변경하였다. 기능 함수 내의 또다른 기능 함수의 반환이 예상과 다르다는 오류가 발생했다. 여기서 내가 기능 함수를 함부로 수정하면 안될것 같아 리더님께 여쭤봤는데, 현재 잘 작동되고 있는 메서드이고, 중요한 기능이라 시간을 들여 테스트 코드를 제대로 작성하는 쪽으로 진행하는게 좋다고 말씀해주셨다. 역시 “해도되나?” 는 안하는게 맞다. 테스트 코드 내 함수에서 param을 수정하였다. 기능 함수의 일부 params는 Query[None] 타입이다. 이는 값이 존재할 땐 Query로 처리하지만 없을땐 None으로 처리하겠다는 의미로 FastAPI에서만 쓰인다. 이 값이 데이터베이스 쿼리에 포함되면서 오류가 발생함. 실제 배포 서비스에서는 해당 값들이 어떤 이유로든 반드시 입력되어서 오류가 발생하지 않은 걸까? 일부 param들에 구체적인 값을 넣어줬더니 PASS 처리 되었다. 하지만 확실한 테스트를 위해 내 가설을 검증할 필요가 있다. 검증 사항 : 위 값들은 항상 주어질 수 밖에 없는 값인가? 모든 종류의 입력에서 무조건 설정하게 되있는 경우 입력이 없을때 넣을 값에 대한 로직이 존재하는 경우 기본값 있는 경우 따라서 이 값들은 입력값이 반드시 존재한다. schemas 상 범위 내의 값을 무작위로 넣어주면 될듯 ⇒ 통과 회고 이번에는 테스트 해야 할 함수들이 정상적으로 작동하고 있다는 확신이 있기 때문에 테스트 코드만 집중적으로 공략할 수 있었다. 만약 내가 방금 만들어낸 코드의 테스트가 실패했을 때, 내 테스트 코드를 신뢰할 수 없다면 오히려 코드의 정확성을 망치게 될 것 같다. 확실하게 무엇을 테스트 해야하는지, 공부했던 규칙들을 지키면서 신뢰성 있는 테스트 코드를 공부하자. ...

2023년 11월 24일 · 2 분 · 배준수

Test ON!

Today I Learned 날짜 2023년 11월 23일 목요일 내용 생각보다 빠르게 Task 하나를 완료했다. 태용님께 우리 회사의 일하는 방식, 우리 서비스의 구조에 대한 설명을 들었다. 이슈 해결하기 Logic 살펴보기 호출되는 곳 Parameter 계획 세우기 문제 : 어드민 내에서 스토어 상태 처리 변경 미작동 원인 : 리뷰의 status를 변경할 때, 관계가 있는 product를 조인함. 하지만 어떤 리뷰들은 관련된 product가 없음. 따라서 join문에서 반환되는 값이 없기 때문에 선택한 리뷰 레코드를 DB에서 찾아내지 못함. 해결방안 : ...

2023년 11월 23일 · 5 분 · 배준수

Task ON!

Today I Learned 날짜 2023년 11월 22일 수요일 내용 로컬에 개발 환경을 구축하는데 성공했다.. 역시 막힐땐 차근차근 적으면서 해야 잘 풀린다. Docker 에 대한 이해가 너무 없다… 서버 가동을 위한 데이터베이스 설정 과정(장문주의) 초기 세팅(기존 시도들로 인한 오류를 방지하기 위해) 생성된 postgres 폴더 삭제 docker system prune -a 로 모두 삭제 docker volume prune -a 로 볼륨도 삭제 이후 각 단계마다 b,c 는 반복 docker-compose -f .\docker-compose.local.yml up 으로 구동 2. 가설 : local-postgres가 superuser 계정을 이용할 수 없어서 DB를 새롭게 못만든다. 계정 비밀번호 설정해주자 ...

2023년 11월 22일 · 3 분 · 배준수

로컬 환경 세팅하기

Today I Learned 날짜 2023년 11월 21일 화요일 내용 로컬에 서비스를 설치하면서 어려움을 겪는 중이다. 서버가 가동이 안된다…. docker-compose를 실행하면 global_alpha_dev 라는 role이 없다고 나오는데, 이와 관련된 부분이 어딘지를 도저히 모르겠다… 시작이 반이라는데, 시작도 못했으니 반도 못왔다. 회고 잘 안되니까 갑갑하다ㅏㅏㅏㅏㅏㅏㅏ

2023년 11월 21일 · 1 분 · 배준수

디자인 설계 공부

Today I Learned 날짜 2023년 11월 20일 월요일 내용 조그만 QA에 관련된 Task를 맡기 위한 기초 공부에 시작했다! UML 모델 만들때 쓰는 표준언어 클래스 다이어그램 UML은 14개의 다이어그램이 있다. 클래스 다이어그램은 클래스 내부의 정적인 내용이나 클래스 사이의 관계를 표기. 개념 차원 : 문제 도메인의 구조를 나타내며, 사람이 풀고자 하는 문제의 구조와 개념 기술 명세와 구현 차원 : 소프트웨어 설계 등을 위해, 소스코드와 깊은 연관 클래스 클래스의 이름, 속성, 기능 등 표기 ...

2023년 11월 20일 · 3 분 · 배준수

Onboarding 회고

Onboarding 회고 시작 전의 생각 꽤 흔한 CRUD 사이트를 만드는 과제였다. Angular나 FastAPI는 처음이라 걱정은 되었지만, 크게 복잡한 기능도 없어서 많이 낙관했다. 유저와 관련된 기능도 회원가입과 비밀번호 암호화가 제외된 로그인 뿐이었고 내부에 Todo와 관련된 기능들도 생성, 삭제, 조회 ,수정 뿐이라 조금 공부하면 해볼만할 것이라고 판단했다. 파이썬이라는 언어의 측면에서도 알고리즘 공부때 많이 사용했으므로 걸림돌이 되지 않을 것이라고 생각했다. 문제 정의 구현에 매몰되어 구현이 늦어졌다. 온보딩 과제를 진행하는데 태용님의 권유로 ChatGPT를 배제하였다. 기존에도, 공식 Document를 읽고 원하는 지식을 얻는 습관이 필요하다고 생각하였기에 충분히 납득하였다. Document마다 다르긴 하지만 FastAPI와 Angular는 개념들에 대한 설명과 사용 예시가 나와있었고 작은 프로젝트를 진행하는 과정도 나와있었다. ...

2023년 11월 18일 · 4 분 · 배준수

Onboarding OFF

Today I Learned 날짜 2023년 11월 17일 금요일 내용 화요일부터 너무 바빠다는 핑계로 TIL 작성을 미뤘다. 습관화하는 이유는 어떤 상황에서도 루틴을 유지하기 위함이니 반성해야겠다. 꼭 적자. 온보딩 종료 지난주 월요일(구현은 화요일부터)에 시작된 온보딩 과제가 종료되었다. 목요일에 다른 개발자 분들 앞에서 발표를 마쳤다. 나와 같이 입사한 주영님이 기가 막히게 잘 하셨는데 그에 비해 내 결과물이 참 초라하긴 했다. 부끄럽긴 했지만, 갈 길이 머니 계속 노력해야 하고 갈 길이 정말 멀다는 걸 느꼈다는 것만으로도 만족한다. Angular를 제대로 이해하지 못했다. Todo 상세보기를 위한 데이터를 query parameter로 넘긴 것, 화면 출력 값 업데이트를 위해 새로고침 한 것, Subscribe 와 비동기의 개념 , 자신이 작성한 코드에 대한 이해와 고민이 부족한 것 등에 대해서도 감사한 피드백을 많이 받았다. 사실 발표 전에는 내 수준이 너무 부족해서 지적 받을게 산더미같아 발표하기 싫었다. 오늘 대표님이 피드백은 다른 사람이 시간을 들여 제공하는 것이기에 감사해야 한다는 말씀을 하신걸 듣고 생각해보니 정말 감사한 시간이었다는 생각이 든다. 덕분에 끝났다는 생각보단, 더 보완해서 완성도를 높이고 싶다는 욕심이 생겼다. ...

2023년 11월 17일 · 2 분 · 배준수

파이썬 알고리즘 : 2 x n 타일링

2023년 11월 17일 알고리즘 문제풀이 문제 2 x n 타일링 난이도 Lv.2 코드 1 2 3 4 5 6 7 8 9 10 11 12 def solution(n): dp = [0 for _ in range(60001)] x = 1 while x <= n: if x == 1: dp[x] = 1 elif x == 2: dp[x] = 2 else: dp[x] = (dp[x-1] + dp[x-2])%1000000007 x += 1 return dp[n] 많이 볼 수 있는 DP문제이다. 2 x n 일땐 이전 조합들을 합친 것만으로도 다음 갯수를 산출할 수 있어서 크게 어렵지 않다. 수가 커지기 때문에 나머지로 표시해야 한다는 사실을 잠시 잊었다.. ...

2023년 11월 17일 · 1 분 · 배준수

파이썬 알고리즘 : X만큼 간격이 있는 n개의 숫자

2023년 11월 16일 알고리즘 문제풀이 문제 X만큼 간격이 있는 n개의 숫자 난이도 Lv.1 코드 1 2 3 4 5 6 7 8 def solution(x, n): answer = [] d = x num = x while len(answer) < n: answer.append(num) num += d return answer 크게 어려울 것 없는 문제였다. 문제에 제한 조건이 주어지는데 while문에 추가하면 마지막 테스트 케이스에서 틀린다. 문제가 알아서 제한하여 준다는 뜻이니 걸지 말것. ...

2023년 11월 16일 · 1 분 · 배준수

파이썬 알고리즘 : 124 나라의 숫자

2023년 11월 14일 알고리즘 문제풀이 문제 124 나라의 숫자 난이도 Lv.2 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 def solution(n): nums = [] while n: a = n%3 if a: n = n//3 nums.append(str(a)) else: n = n//3 -1 nums.append('4') nums.reverse() answer = ''.join(nums) return answer 코드 자체는 단순해보이지만 해결하는데 정말 어려운 문제였다. 등장할 수 있는 숫자가 3개(1,2,4)였기 때문에 3진법을 이용하면 될 것 같다는 생각 자체는 바로 떠올렸다. 하지만 답을 유추해내기 쉽지 않았는데 추가적인 조건이 있기 때문이다. 아래 표를 통해 설명하겠다. ...

2023년 11월 14일 · 2 분 · 배준수