스크린샷과 에셋6 분 읽기

투명한 화면을 렌더했더니 직전 테스트의 그림이 돌아왔습니다

로그인이 필요한 화면을 독립 뷰로 뽑아 유닛 테스트에서 PNG로 렌더합니다. 완전히 투명한 화면을 렌더했더니 앞 테스트가 그린 그림이 그대로 나왔습니다. 3,676 픽셀이었습니다.

#screenshots#swiftui#testing#ios#gotchas
두 패널 도식. 왼쪽은 투명한 콘텐츠를 렌더하면 렌더러가 새 이미지를 만들지 않고 직전 렌더 결과를 그대로 돌려주는 상황을 보여주며, 27포인트 투명 조각을 요청했는데 앞 테스트의 86포인트 그림이 3,676픽셀로 돌아온 수치를 담는다. 오른쪽은 사라짐은 값 테스트로 보고 렌더 캡처는 보이는 것만 본다는 원칙과, 틴트 상속·비배경 픽셀 비율 검사를 나열한다.
사라졌는지는 값으로 봐야 합니다. 렌더는 보이는 것만 증언합니다.

로그인 세션이 필요한 화면은 시뮬레이터에서 그냥 띄울 수 없습니다. 그래서 화면을 값만 받는 독립 뷰로 뽑아 유닛 테스트에서 PNG로 렌더하는 방식을 씁니다. 픽셀을 직접 보고 디자인을 확인하려는 목적입니다. 뷰를 쪼개는 건 설계상으로도 낫습니다.

그러다 가장 이상한 걸 만났습니다. 완전히 투명한 화면을 렌더했더니 앞 테스트가 그린 그림이 그대로 나왔습니다.

당신의 렌더 검증은 "무언가 그려졌다"를 보고 있습니까, **"이번에 그려졌다"**를 보고 있습니까?

렌더러가 직전 결과를 돌려줍니다

콘텐츠가 전부 투명하면 렌더러가 새 이미지를 만들지 않고 직전 렌더 결과를 그대로 돌려줍니다.

투명도 0인 27pt 조각을 구웠더니, 앞 테스트가 그린 86pt짜리가 3,676 픽셀로 나왔습니다. 같은 좌표·같은 크기라서 "왜 안 사라지지"로 한참 헤맸습니다.

렌더 검증이 거짓말한 다른 사례는 스크린샷이 남의 앱 것으로 오염된 적에 있습니다. 테스트를 직렬로 돌리는 것으로도 막히지 않습니다. 순서만 직렬일 뿐 렌더러 상태는 공유됩니다.

결론은 이렇습니다. "빈 화면"·"완전히 사라졌다"는 값 테스트로 봐야 하고, 렌더 캡처는 보이는 것만 봐야 합니다.

같은 파이프라인에서 나온 함정 셋

환경변수가 테스트 프로세스에 안 닿습니다. 셸에서 출력 경로를 넘기는 것도, 전용 접두사를 붙이는 것도 안 됐습니다. 임시 디렉터리에 쓰고 경로를 print해서 호스트에서 그 경로를 여는 방식으로 바꿨습니다.

틴트를 안 걸면 색이 거짓말합니다. 실제 앱에서는 상위 탭 뷰의 틴트를 시트가 환경으로 상속받습니다. 격리 렌더에는 그게 없어서 시스템 파랑이 나옵니다. 색이 틀렸다는 버그로 오인하기 딱 좋습니다.

크기만 검사하는 단정은 빈 화면을 통과시킵니다. 1200×340 PNG가 나왔다는 것은 캔버스가 그 크기라는 뜻이고 내용에 대해서는 아무 말도 하지 않습니다. 좌상단 픽셀을 배경색으로 잡고, 그와 다른 픽셀의 비율까지 봐야 합니다.

당신이라면?

요소가 사라졌는지 확인해야 합니다. 어떻게 보겠습니까?

  • 렌더해서 눈으로 본다 — 투명 렌더는 직전 그림을 돌려준다. 사라짐은 이 방법으로 관측 불가다.
  • 크기를 단정한다 — 빈 화면이 통과한다.
  • 값으로 본다 — 뷰가 그 요소를 만들지 않는지 상태·트리로 확인한다.

세 번째뿐입니다. 그리고 이건 우회가 아니라 역할 분담입니다. 렌더는 "이렇게 보인다"를, 값 테스트는 "없다"를 증언합니다.

자가진단 세 줄

  1. 투명·빈 화면을 렌더로 검증하고 있습니까? 렌더러가 직전 결과를 돌려줄 수 있습니다. 없어졌다는 판정은 값으로 하십시오.
  2. 격리 렌더에 실제 앱의 환경(틴트·폰트·다이내믹 타입)이 주입돼 있습니까? 없으면 색과 크기가 실제와 다르게 나옵니다.
  3. PNG 단정이 크기만 봅니까? 배경색과 다른 픽셀의 비율을 함께 보십시오.

솔직한 부분

투명 화면 문제는 결국 "렌더로는 검증 못 한다"로 결론 냈습니다. 우회한 게 아니라 검증 수단을 포기한 것입니다.

그리고 이 방식으로는 누를 수 없습니다. 시뮬레이터 CLI에는 탭 서브커맨드가 없고, 유닛 테스트 렌더에는 상호작용이 없습니다. 즉 이 파이프라인이 답할 수 있는 질문은 "이 상태를 그리면 어떻게 보이나"까지입니다. "이 버튼을 누르면 되나"는 여전히 다른 도구가 필요합니다.

관련 글