brunch

You can make anything
by writing

C.S.Lewis

by 이지원 Feb 03. 2024

에이슬립의 좋은 동료와 팀에서 일한다는 것

8년 전 이맘때쯤 모든 게 낯설게만 느껴졌던 첫 회사에서의 첫 출근. 흘러버린 시간만큼이나 삶과 커리어에 많은 변화가 있었던 시간들.


속은 텅 빈 채 겉만 빛나게 포장된 사람과 실제 내 모습과는 거리가 다소 먼 SNS에 쓰인 감투보단 실제로 지금 당장 구체적으로 무엇을 해낼 수 있고 어떠한 기여를 할 수 있으며 어떠한 좋은 영향을 팀에 전달해 줄 수 있는지가 살면서 보다 중요한 가치로 다가왔었던 2023년 하반기.


에이슬립의 좋은 동료와 팀에서 기억하고 싶은 2023년 하반기의 순간과 감정을 돌이켜보고 이미 시작된 2024년에는 입과 손은 무겁게 그리고 꾸준함과 일관성 있는 행동으로 작은 성공을 반복하며 높은 목표를 성취하고 오직 결과로서 과정을 이야기하는 사람으로 성장하길.


사실(Fact)

사건이나 상황을 기록. 무엇을 했는지, 무엇을 경험했는지를 파악. 객관적인 기록으로 생각이나 감정을 함께 적지 않는다.


B2B SaaS Product 테스트 수명주기(STLC) 관리  


요구사항 분석

테스트 계획

테스트 케이스 설계

테스트 환경 설정

수동/자동 테스트 실행 및 종료


B2B SaaS Product를 위한 웹 모바일 API 검증 시스템 환경 구축 및 구현


823af96 test, chore: 웹 대시보드 Visual Regression 자동화 테스트 환경 구축을 위한 Playwright PoC 완료

d09460e chore: 비기능 테스트 결과 분석 대응을 위해 네트워크 LogParser 추가

da180aa chore: 네트워크 테스트 병렬 스레드 2개 구성 수정 및 무한루프 수정

f285747 chore: iOS 네트워크 테스트 10분 측정 비교를 위한 Loop 로직 시간 변수 600000ms로 변경

e822c44 chore: iOS 네트워크 테스트 사전 환경 준비 및 시범 테스트 한국-호주

30b75c0 chore: xUserID를 테스트와 라이브 서버 모두 동일한 값으로 사용하도록 수정

0442542 chore: 코골이 Data API 단일 세션 조회 — GET v3/sessions/{session_id} 라이브 배포 테스트를 위한 CI 구성 완료

d1db0d3 chore: 코골이 Data API 유저별 평균 통계 — GET v1/users/{user_id}/average-stats 라이브 배포 테스트를 위한 CI 구성 완료

750f18f test, refactor: 2023–12–01~2024–03–31 세션에 대한 데이터 정합성과 API 기능 검증 완료

53ebf35 test: 코골이 Data API GET v3/sessions/{session_id}에 대한 수면 통계 및 수면 단계 데이터 정합성과 API 기능 검증 완료

89c21de fix: snoring_stages가 null이 아닐때 3개의 배열이 동일한지 boolean 값으로 저장하는 변수가 초기화되고 assert문이 실행되도록 수정

c803e0c refactor: Stages 길이 검증간에 누락된 assert문 조건 추가

f61c81b test: 코골이 Data API Get Sleep Session Detail 엔드포인트 v3/sessions snoring_stages가 0 1로만 구성되어 있는지 수면 단계 검증 구현 완료

149427e test: 코골이 Data API Get Sleep Session Detail 엔드포인트 v3/sessions breath_stages가 0 1로만 구성되어 있는지 수면 단계 검증 구현 완료

d41a6c4 test: 코골이 Data API Get Sleep Session Detail 엔드포인트 v3/sessions sleep_stages가 0 1 2 3으로만 구성되어 있는지 수면 단계 검증 구현 완료 1. TOO_MANY_DEFECTS_IN_SLEEP_STAGES 조건 구현 2. sleep_stages의 모든 값이 의도한 배열의 값과 일치한지 구현

4364ada chore: GitAction CI 환경 실행을 위해 Cucumber Hook에서 setDefaultTimeout을 48초에서 20분으로 변경

5179a9b test: 코골이 Data API Get Sleep Session Detail 엔드포인트 v3/sessions Stages 길이 수면 단계 검증 구현 완료 1. snoring_stages가 null인 경우 검증된 세션 수와 모두 null이 아닌 경우 검증된 세션 수를 검증하도록 구현

f702c3d test: 코골이 Data API Get Sleep Session Detail 엔드포인트 {string} snoring_ratio + no_snoring_ratio = 1 수면 통계 검증 구현 완료

6c4610c refactor: 코골이 Data API stat이 null이고 SNORING이 있어서 세션 검증을 건너뛰는 로직에서 1개의 if로 수정하고 && 연산자로 조건 처리 후 continue 하도록 수정

3bdc349 test, refactor: Get Sleep Session Detail 엔드포인트 {string} time_in_sleep_period 수면 통계 검증 구현 완료 및 검증 로직 개선 1. time_in_sleep_period 계산을 stat 객체가 null이 아닌 경우에만 진행하도록 처리하여 TypeError: Cannot read properties of null 에러 수정 2. stat이 null이고 SNORING이 있어서 세션 검증을 건너뛰도록 처리 3. stat은 존재하지만 snoring과 no_snoring 값이 모두 null이라서 time_in_sleep_period 계산이 불가한 세션에 대한 로깅 4. 테스트 종료 시 검증된 전체 세션에 대한 로깅

17e9c8f chore: SDK 모바일 push 트리거 제거

2e5134a test: 코골이 Data API 구현중 TypeError: Cannot read properties of null (reading ‘time_in_sleep’) 코드 에러 확인 필요

69e10cd test, chore: 비기능 네트워크 테스트 QA 사전 준비, 네트워크 로그 확인을 위한 iOS 측정 종료 플로우 구현

7851363 chore: SDK 네트워크 테스트 사전 준비 [BROWSERSTACK_NETWORK_LOGS_NOT_CAPTURED] 에러 수정

26bedf0 홀수 번 업로드 후, 재시작 했을때 0번째 업로드가 생략되는 버그 수정 빌드 클라우드 실기기 15대 기본기능 검증

24126b6 test, refactor: API 클래스 constructor timezone default null 처리 및 v1/sessions 요청 후 특정 조건을 만족하는 세션을 새로운 배열로 생성하는 로직 구현 1. base 클래스에 새로운 배열을 담고 사용할수 있는 sessionIDs setter getter 추가 2. 특정 조건을 만족하는 새로운 세션 배열을 생성하는 When 단계 코드 추가 3. api 클래스의 생성자 함수 사용간에 timezone이 필요치 않은 Get 요청 대응을 위해 timezone이 매개변수로 전달될때만 사용하고 기본값은 null 처리

2ff2259 chore: Mobile SDK push 트리거 제거 및 apiTest CI에서 npm 패키지 설치간에 — legacy-peer-deps 추가

129c541 API 검증 시스템 고도화-Cucumber Axios 초기 설계 및 코드 검증 완료

69f5ca1 chore: Android capabilities 병렬 스레드 실행 개수 조정 및 기본기능 검증(1=>15)

2bd29c6 안드로이드 Huawei P30 OS 9.0 디버깅

c1fb8fb wdio-bstack-single.Android.conf.js의 capabilities app 최신빌드로 수정

03e1b95 클라우드 인프라 테스트 환경 개선을 위한 모든 인터페이스를 정상/비정상 플로우로 실행하는 Android/iOS coreLogic suite 분류

f51f168 안드로이드 initailUserID getText() 진행 전, 11001 AsleepConfig is null 에러 방지를 위한 pause 로직 추가

88336e0 iOS 공통 페이지 설계-getter 엘리먼트 구현 및 Click, Input Action 메서드 구현

1d97b62 BrowserStack 환경 전환에 필요한 capabilities app 값 변경

b9d0d99 SDK 2.3.0 Android 15대 실기기 OS 8 ~ 14 기본기능 검증

de1c6de 15개 실기기 기본기능 코어 로직 테스트 전체 소요 시간 10분으로 최적화 완료

3233e29 [BROWSERSTACK_INVALID_OS_VERSION] 에러 수정을 위한 Motorola Moto G71 5G OS 버전 9.0 => 11.0 수정

c7ea7c8 브라우저스택 병렬 스레드 에러 수정-Queued에 maxInstances가 2개를 초과하지 않고, Running에 2개씩 실행되도록 수정

bb588b2 SDK 에뮬레이터 OS 14.0 9.0 GitAction CI 실행 환경 구성

b88e680 안드로이드 테스트 앱 수정 => 16개 실기기 빌드 인수 테스트 진행

6b657a7 안드로이드 클라우드 실기기 16개 병렬 스레드 2 구성

690f04a 네트워크 테스트 로직 구현 및 13개 실기기 디바이스 병렬 스레드 환경 구성

50ef289 BasicSuite 16개 테스트케이스 구현 및 온프레미스/클라우드 인프라 코드 검증 완료

a412a82 안드로이드 BasicPage 공통 메서드 리팩토링

64b8549 안드로이드 BasicPage 공통 메서드 설계

0ac5f1f Android iOS 공통 Page 클래스에 구현된 메서드의 driver pause 값 2000 -> 1500ms 수정

fd75d1a Android 테스트 앱 전체 Locator 구현(Button/Text Field)

5db265d e2e-MobileSDK.yaml 워크플로우에 npm run 스크립트 최신화

8b9e6d9 Android/iOS conf.js 구성 분리 및 iOS 클라우드 실행 확인 완료

b2c125c BrowserStack iOS app Key value 추가

61ea4c5 SDK Mobile 클라우드 PoC 구축 및 모바일 CI 환경 구성-의도된 실패 발생 시 플로우 파악-네트워크 로그 추가

389923d SDK Mobile 온프레미스/자체 호스팅 및 클라우드 인프라 환경 구성

7fe0798 CI Fail 디버깅-mocha timeout 2분 설정

3e5397d DB에서 가져온 mau 도메인 객체들을 index로 iteration 하면서 dto를 만들어서 생긴 문제에 대한 사이드이펙트 검증 로직 보완

825e160 MAU & Stickness API 자동화 구현 및 TEST/LIVE CI 구성 완료

ab2f577 marginOfError 범위 0.7에서 1로 수정

995f206 수면점수 데이터 정합성 API QA TEST/LIVE 테스트 코드 구현 및 CI 구성

d2ecfe0 iOS 자동화 구현

ad9d2b0 Nightwatch Mobile 초기 구조 셋업

b469954 Data API 회귀 테스트 라이브 환경 주석 제거

86a96dd [모바일 자동화] webdriverIO 최신 버전에서만 발생하는 No browserName defined in capabilities nor hostname or port found 버그 수정

e946f54 Mock API json 파일 수정 및 모바일 자동화 poc 프로젝트 추가

2237d89 수면 메트릭 API 라이브 환경 구성 수정

bd857a1 신규 수면 메트릭 DB/API 라이브 실행 환경 구성

771f316 test_getV1UsersAverageStats, test_getV3Sessions npm run 스크립트 추가

fa78408 getV3Session 및 getV1UsersAverageStats API 자동화 구현 및 검증 완료

c86e3cc getV1UsersAverageStats 검증 및 자동화 구현 완료

3fe1f0f unstable_breath_ratio가 0 이상인 경우 안정한 호흡으로 판단되도록 검증 로직 수정

7b1ac1a DataAPI 데이터 정합성 검증 CI 구성

e844ef6 Mock API workflow_dispatch Select Test Environment을 choice type으로 수정

f744525 Mock API workflow_dispatch Select Test Environment 가능토록 수정

5ab622c CI 구성을 위한 uploadToSlack 함수 분리 및 npm run slack_report(node ./utils/slackUpload.js) 스크립트 추가

d7fd657 필터로 생성된 sessionIDs 배열의 길이만큼 루프 돌면서 19개의 관계식 검증간에 1개라도 실패할경우 테스트 실패처리 시키는 로직 추가

9043005 after hook에서 uploadToSlack 함수 동작하도록 수정

d585197 무호흡 사용/미사용 테스트 스위트 분리를 위한 api 요청 데이터 변수화 및 결과 로그 출력 개선

7c756f4 unstable_breath_ratio 값에 적절한 호흡인지 검증하는 switch문 로직 추가

e3d3580 수면 메트릭 데이터 정합성 검증 코드 구현 및 검증 완료

56eb2d8 light_ratio ~= round(time_in_light / time_in_sleep_period, 관계식검증에 필요한 오차 허용 범위 tolerance 추가

8cfb81f filter 메서드로 생성된 배열을 순회하면서 v3/sessions Get 요청보내는 로직 추가

cec71bf nightwatch supertest 라이브러리 내부 에러로 인한 axios mocha chai 초기 셋업

f84bd1d Nightwatch supertest 내부 코드 중 interface Request 버그 조사

0299b06 nightwatch supertest 플러그인 사용시 NightwatchAssertError-expected 201 Created, got 403 Forbidden 에러 디버깅

f6bef86 테스트 자동화 환경 마이그레이션을 위한 루트 프로젝트 구조 정리

6fc7b13 자동화 환경 전환 준비 및 SDK 개발팀을 위한 모바일 자동화 샘플 가이드 프로젝트 추가

b50e75a Node.js 기반 통합 테스트 프레임워크 nightwatch 초기 셋업

0194af5 Mock API Live 워크플로우 구성

2330e61 Mock API Test Live 환경 분리

7a9fdae Mock API Live 배포 후 테스트를 위한 Live 환경 변수 구성

122c58d Mock API 자동화 테스트 케이스 구현 완료

9a57c26 CI 서버 timezone과 로컬 mac timezone 불일치 원인 파악으로 인한 워크플로우 중단

75557dd Newman GitAction CI 환경 push, dispatch, schedule, 구성

a05faa5 API 프로젝트 정리

0b0a740 API 상시 테스트 환경 구축

6478657 WebdriverIO Cucumber setup 및 e2e CI 구성

af22b15 최초 1회 마이크 권한과 배터리 옵션을 허용하도록 처리하는 before hooks 구현

13821dd iOS conf 수정 및 안드로이드 샘플 코드 CI 테스트

a2596e1 SDK TestData JS -> TS 변환

92836ba SDK TestData 구조 정리

5d18e35 Zebrunner 통합 환경 구축

bcf279a ci workflow 수정 및 customCommands 함수 정리

4e8317c SDK E2E CI 환경 구현

0c9b00a GitAction CI 환경 테스트 실행을 위해 Headless Browser 사용토록 수정

32486fd Web Dashboard 자동화 셋업 및 CI 구성

f95018d Original error: socket hang up 디버깅 및 코드 개선

629ff9f appiumServer shell script 정리

d0e7ae8 screenObject, 테스트 코드 정리 및 slackReporter 설정

3d184e2 모바일 페이지 개체 구조화 및 AndroidAsleepConfig 테스트 코드 디버깅

b602d4e 모바일 SDK, 웹 대시보드 자동화 환경 초기 셋업

7c20568 Product 분류 및 README 추가

2bb5ead Initial commit


발견(Discovery)

사실에서 더 나아가 새롭게 알게 된 것이나 느낀 것을 기록. 감정이나 생각을 포함한다.


좋은 커밋 메시지에 대해 찾아보고 적용하자.

더 나은 개발 환경에 대해 고민하자.

무언갈 개발할 때 내가 필요로 하는 이미 만들어진 바퀴를 발견하는 역량을 키워야겠다.

메인 언어의 깊은 이해와 설계 역량을 지금보다 발전시키기 위해 사용 중인 언어 역량과 디자인 패턴에 대한 고민과 학습을 꾸준히 하자.

더 나은 QA 활동을 위해 많은 기술적인 변화가 있었고 시도했다.

당장의 불을 끄기보단 중장기적으로 다가올 변화를 예측하고 미리 예방하고자 노력한 흔적들이 보였다.

좋은 테스트 코드와 검증 구조를 위해 많은 고민과 변화가 있었다.

연관된 작업 태스크들은 합치는게 좋을 것 같다.

앞으로도 좋은 테스트 코드와 검증 구조에 대해 고민하고 발전하자.

사람이 잘하는 영역과 코드가 잘하는 영역을 구분하여 테스트 수명주기 활동을 수행하고 관리했다.

내부 프로덕트 고도화에만 모든 에너지를 집중했던 하반기였다.

좋은 팀과 동료 그리고 리더를 만나는건 큰 행운이자 축복이다.


배운점(Learning)

경험하고 느꼈던 것을 토대로 배운 교훈이나 가치를 기록하여 앞으로의 커리어 과정에서 참고하여 도움이 되도록 한다.


모든 과거에 내가 했던 선택과 결정은 시간이 흘러 더욱 성장하고 성숙한 미래의 내가 보았을 때 당연히 서툴고 의문이 생기기 마련이다. 하지만 과거의 선택과 결정은 과거의 내가 할 수 있는 최선이었다. 그러니 과거에 내린 결정을 후회하고 아쉬워하기보단 오늘 하루 어떻게 하면 어제보다 조금 더 성장할 수 있을까를 고민하고 미래의 내가 오늘의 결정을 돌이켜보았을 때 부끄럽지 않을 정도로만 노력하자.

beforeAll, beforeEach, afterAll, afterEach 후크에는 어설션을 포함시키지 않는다. 테스트 전제 조건과 사후 조건에는 검증에 필요한 조건 처리만 진행한다. 만약 전제 조건과 사후 조건에서 무언갈 어설션 해야 한다면 테스트 케이스 설계가 적절한지를 재검토한다.

테스트 속도를 위해 테스트 로직과 어셜션 사이에 가급적이면 Pause를 사용하지 않고 DOM에 존재하는 하나 이상의 요소와 일치하면 true를 반환하고 그렇지 않으면 오류를 발생시키는 대기 로직을 사용한다.

Unit과 Integration 테스트 계층이 아니라면 모든 테스트 케이스의 상태와 환경에 대한 독립성과 고정 상태를 반드시 유지할 필요는 없다. 코드의 중복을 줄이고 언제 어디서 진행해도 동일한 결과를 만족하는 구조로 발전하여 테스트 코드 유지관리에 필요한 비용 절감으로 이어질 수 있지만 실제 사용자 행동을 코드로 수행하는 과정에서 발생하는 모든 Interaction은 때때로 복잡하고 각 시나리오의 독립된 상태를 유지하는 과정이 더욱 까다로울 수 있기 때문이다.

CICD 파이프라인에서 개발 QA 운영 각 서버에서 운영되는 특정 테스트 스위트의 테스트 케이스 실행을 피하고 싶다면 주석보단 프레임워크에 내장된 skip을 활용하자. 협업 관점에서 주석과 skip이 전달하는 의미는 서로 다르기 때문이다. 또한 테스트 결과 리포트에 표현되는 데이터에도 큰 차이가 있기 때문이다.

조건 처리(IF)를 해야 하는 테스트 코드는 가급적이면 작성하지 않는다. 동작에 따라 서로 다른 로직을 수행하면 테스트가 복잡해지고 E2E 테스트 계층 특성상 UI 변화에 민감하여 깨지기 쉬운 코드가 쌓이기 때문이다. 또한 어떤 조건문이 실행되었는지 파악하는 과정과 더불어 조건에서 호출되지 않은 기능이 실패할 경우 버그를 놓칠 수 있기 때문이다.

테스트 코드의 테스트 단계는 복잡하지 않고 간단하게 구현하고 한 가지의 기대 결과만을 검증하도록 구현한다. 하나의 테스트 케이스에 두 개의 서로 다른 유형의 기대 결과를 검증하도록 구현하지 않는다. 테스트 케이스를 간결하고 명확하게 구현할수록 테스트 로깅과 결과 해석에 보다 효과적이기 때문이다.

보다 좋은 품질 엔지니어로 성장하기 위해 필요한 지식 탐구와 학습을 꾸준히 유지하고 기록하여 묵묵히 성장할 수 있도록 학습 환경을 앞으로도 계속해서 유지할 필요가 있다. 실속 있고 정말 멋진 커리어를 쌓아가는 사람들의 손과 입은 가볍지 않고 무겁고 겸손하기 때문에 내부 프로덕트 성공에만 모든 에너지를 집중하며 나를 갈고닦는 시간을 오랫동안 유지할 수 있도록 의도적인 환경 설계가 앞으로도 필요하다.

실체 없이 허세와 거품이 넘쳐나는 SNS의 인정 욕구에 집착하지 말고 내부 프로덕트에 오늘 하루를 묵묵히 집중하다 보면 함께 일하는 사람들이 먼저 나를 알아봐 주고 결국 내부에서의 인정을 받게 된다. 내부에서의 인정을 받게 되면 자연스레 개인 브랜딩에 필요한 재료에는 구체화된 경험과 신뢰 그리고 믿음이라는 힘이 생긴다.

좋은 팀에서 선하고 능력 있는 동료와 리더분들을 만난 덕분에 좋은 커리어를 쌓아간다는 것이 무엇인지 몸소 느끼게 되었다. 옆자리 동료와 리더분들은 사회에 획기적인 변화를 가져올만한 대단한 생각을 갖고 있거나 개인의 성공을 가져올 실체 없는 큰 이야기를 하지 않는다. 오히려 때로는 하찮아 보이는 일과 사소해 보이는 일들을 꾸준히 해내면서 각자의 전문성을 입과 손이 아닌 성과와 결과로서 증명해낸다. 그리고 그 과정에서 주변 동료들에게 감정적으로 피해를 주거나 나쁜 에너지를 전파하지 않는다. 우리 팀 동료분들과 리더분들과 함께하다 보면 과거에 어떤 좋은 개발 선배가 해줬던 얘기가 떠오르는 건 왜일까, 어떠한 분야든 입과 손이 가벼운 사람들은 몇 가지 특징을 지니고 있는데 겉으로 표현된 모습과 실체는 너무도 다르다는 것이다. 자신을 포장하는 말과는 달리 직접 그 일을 하는 과정을 눈으로 보거나 시켜보면 전혀 손을 못 대거나 전문성 없이 뜬구름 잡는 이야기를 하는 경우가 많다는 것이다. 심지어는 입과 손으로 실체 없이 표현된 매력적인 모습과는 달리 손발 오그라드는 튜토리얼 수준의 결과물인 경우가 많다는 것이었다. 덕분에 나를 표현하는 수단과 방법에는 내가 실제로 그것을 해낼 수 있고 결과를 만들고 있는 것들이 아니라면 결코 하지 않는다는 삶의 원칙을 만들게 되었고 이렇게 만들어진 원칙 덕분인지 시간이 흘러 좋은 동료분들과 리더분들을 만날 수 있게 된 것이 아닐까 생각해 본다. 앞으로도 계속 함께하며 겸손을 배우고 내실을 쌓아가는 과정에만 집중하고 싶다.


선언(Declaration)  


주말 백엔드 엔지니어 부트캠프 수료 후 B2B SaaS Product(웹 모바일 API) 검증 시스템 개발 및 고도화

사용 중인 언어의 깊은 이해 및 디자인 패턴 학습 후 실무 적용

같은 팀 동료분들과 리더분들처럼 본받을 수 있는 SW QA 분야의 리더로 성장하기

내부 프로덕트 성공에만 모든 에너지를 집중하는 환경 유지하기

묵묵하고 꾸준하고 일관성 있는 성장 패턴을 유지하기

매거진의 이전글 1st TESTech KOREA 2024
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari