-
Notifications
You must be signed in to change notification settings - Fork 49
[6팀 전이진] Chapter 1-3. 완성도있는 테스트 전략 수립하기 #35
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
im-binary
wants to merge
43
commits into
hanghae-plus:main
Choose a base branch
from
im-binary:main
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Member
|
이진님 테스트코드 주차 수고많으셨습니다! 이진님 요번주도 화이팅~ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
과제 3
필수 스펙
기본 과제
필수 스펙 개발과 E2E, 시각적 회귀 테스트를 모두 작성해주세요.
기본과제 제출
심화 과제
테스트 전략 작성해보기의 내용을 참고해서 지금까지 작성했던 프로젝트에 대해 테스트 전략을 구상해보세요.
심화 과제 제출
내가 생각한 최적의 테스트 전략
팀원들이 합의한 최적의 테스트 전략과 이유
➡️ 이야기나눈 피그잼 링크
그 전략에 맞춰 추가한 테스트는 무엇인지 나타내주세요.
이번에 추가된 기능들에 대해 테스트를 어떻게 추가할까 고민해보았습니다.
테스트 전략
드래그 앤 드롭(D&D)의 경우, 실제 마우스 이벤트 시뮬레이션은 단위 테스트 수준에서 구현이 어렵기 때문에 E2E 테스트를 통해 정상 시나리오가 기대대로 동작하는지 검증했습니다.
➡️ 관련 커밋 링크
드래그 이후 발생할 수 있는 예외 상황(엣지 케이스)은 이미 기존 테스트에서 커버되고 있다고 판단하여, D&D 관련 통합 테스트는 별도로 작성하지 않았습니다.
날짜 클릭으로 일정 생성 기능은 기존 기능과의 연동을 고려해 통합 테스트를 추가했고, 전체 플로우가 정상적으로 작동하는지 검증했습니다.
➡️ 관련 커밋 링크
과제 셀프회고
기술적 성장
이번 과제를 통해 playwright 기반의 E2E 테스트를 설계하고 구축하는 경험을 했습니다. 단순히 테스트 도구를 사용하는 것을 넘어 실제로 운영중인 프로젝트에 도입한다면 어떻게 안정적으로 운영할 수 있을까를 고민했던 과제였습니다.
처음에는 조금은 E2E 테스트에 부정적인 시각을 가지고 있었습니다. E2E 테스트를 돌려야만 마음의 안정을 얻는 플로우라면 기획이 잘못된 것이 아닌가? 생각했습니다. 이전까지는 E2E 테스트를 단순히 유닛 테스트로 검증하기 어려운 UI 컴포넌트 (Slider와 같이 drag로 검증해야 하기 때문에) 등을 위한 보조 수단 정도로 생각했습니다. 하지만 실제로 프로젝트에 적용하면서 조금은 필요성을 체감할 수 있었습니다.
E2E 테스트는 실제 앱의 흐름을 재현하기 때문에 테스트를 실행하면 데이터가 추가, 수정, 삭제 됩니다. 그런데 테스트가 한 곳의 데이터를 건드리기 때문에 의도하지 않는 데이터를 가지고 있거나 의도한 데이터가 이미 등록되어 일정 겹침 문제를 일으켰습니다. 이 문제를 해결하기 위해 처음에는 테스트 완료 후 데이터를 초기화하는 전용 API를 server.js에 추가했습니다. (30b8075)
그런데 조금 더 생각해보니 실제로 프론트엔드 개발자가 테스트 전용 API를 백엔드에 요청하고 그 API를 백엔드가 만들어준다는 게 말이 안 되겠구나 싶었습니다. 그래서 실제 프로젝트에 도입할 때에 선택할 수 없는 방법이라고 생각했습니다.
그래서 데이터 초기화를 서버가 아닌 클라이언트 설정파일
e2e.json으로 옮겼습니다. 테스트가 완료되면 해당 파일의 데이터를 비우는 식으로 구현했습니다. 그러나 테스트 파일이 여러 개일 때 모든 테스트가 같은 저장소를 공유하니 여전히 데이터 충돌이 발생했습니다.이 문제를 해결하기 위해 찾아보다가 Playwright의 워커라는 것을 발견했습니다.
처음에는 워커를 1로 고정해서 순차 실행하도록 했는데 40개의 테스트가 모두 완료되는데 7분이 걸렸습니다. 보통 PR 올리고 배포되기 전에 테스트가 깨지는지 CI가 한 번 돌텐데 이렇게 되면 테스트 하나 때문에 배포 속도가 느려지게 될 것 같았습니다. 조금 더 찾아보니 워커의 고유 ID가 있어 이 고유 ID를 활용해 별도의 저장소를 바라보도록
e2e-{id}.json분리했습니다. 이렇게 하니 테스트 간 간섭을 차단하면서 병렬 실행이 가능해졌고, 40개의 테스트 실행 시간이 7분에서 4분으로 단축되었습니다.이번 과제를 통해 E2E 테스트를 작성해본 경험 뿐만 아니라 어떻게 하면 테스트 환경을 잘 구축할 수 있을 지 경험해보았고 테스트를 작성할 수 있는 개발자에서 테스트 가능한 환경까지 구축해볼 수 있는 개발자로 성장한 것 같습니다.
코드 품질
병렬 테스트 환경에서의 데이터 격리 구현: Playwright의 병렬 실행 기능(
worker)을 최대한 활용하면서도 테스트 간 데이터 오염을 막는 방법을 구현한 점이 가장 만족스럽습니다. 각worker가e2e-{workerId}.json이라는 고유한 데이터 파일을 참조하도록 설계하여, 테스트의 독립성과 실행 속도(7분 → 4분)를 개선할 수 있었습니다.너무 거대한 E2EHelpers 파일: 현재
E2EHelpers.ts파일에 테스트에 필요한 대부분의 헬퍼 함수가 모여있습니다. 아직까지는 테스트 작성할 때 괜찮았는데, 테스트 케이스가 더 복잡해지고 많아진다면 단일 파일이 너무 비대해져 유지보수가 어려워질 수 있을 것 같습니다. 추후authHelpers,eventHelpers등 기능 단위로 모듈을 분리하는 리팩토링을 해볼 수 있을 것 같습니다.학습 효과 분석
테스트를 작성하고 환경을 구성해보면서 단순히 테스트를 작성하는 것을 넘어, 어떻게 하면 팀원들이 스트레스 없이 테스트를 실행하고 디버깅할 수 있을지, 테스트 경험을 개선하는 방법에 대해 더 깊이 학습하고 싶다는 생각이 들었습니다.
과제 피드백
이미 어느정도 진행된 프로젝트에 새로운 기능을 추가할 때마다 늘 “기존 기능이 깨지면 어쩌지?” 라는 걱정이 뒤따랐습니다. 이번 과제도 기존에 있는 프로젝트에 새로운 기능을 추가한다는 점에서 비슷한 상황이라고 생각이 드는데 이미 단위 테스트, 통합 테스트가 작성이 되어 있어서 그런 걱정을 덜어낼 수 있었습니다.
새로운 기능을 구현하면서도 기존 테스트가 계속 통과하는지 확인하는 것만으로도 심리적 안정감을 얻을 수 있었고 기존 기능이 올바르게 동작한다는 확신이 있으니 일일이 수동으로 점검할 필요가 없었던 것 같습니다. 테스트가 단순 검증 도구를 넘어 새로운 개발을 더 빠르고 자신있게 진행할 수 있게 해준다는 것을 체감할 수 있었습니다.
리뷰 받고 싶은 내용
E2EHelpers.ts 클래스의 구조 개선 방안에 대해 조언해주실 수 있나요?
우선, 반복되는 테스트 로직을 클래스(E2EHelpers.ts)로 묶어 재사용하는 접근 방식 자체가 괜찮은지 궁금합니다. 페이지 객체 모델(Page Object Model)과 유사하게, 공통 액션을 추상화하여 테스트 코드의 가독성과 유지보수성을 높이려고 의도했습니다. 이러한 헬퍼 클래스 설계가 일반적인 E2E 테스트 패턴에 부합하는지, 혹은 더 나은 대안이 있는지 1차적으로 검토받고 싶습니다.
만약 이 접근 방식이 유효하다면, 현재 구조의 확장성에 대한 피드백을 받고 싶습니다. 지금은 괜찮지만, 앞으로 테스트 케이스가 늘어나면 이 단일 클래스가 너무 비대해질 것 같습니다. 기능(e.g., 인증, 이벤트 생성, 뷰 전환)에 따라 이 클래스를 어떻게 분리하고 모듈화하는 것이 장기적인 유지보수 관점에서 가장 효율적일지 리뷰받고 싶습니다.