주소 양식 테스트는 예측 가능한 지점에서 실패합니다. 필드가 단순해서 양식이 빠르게 만들어지지만, 그 후 조용히 캐나다 우편번호를 망가뜨리거나 독일 우편번호의 앞자리 0을 떨어뜨리거나 사용자가 홍콩을 선택한 뒤에도 주/도를 요구합니다. 여기서는 실패 집합이 잘 알려져 있고 유한하기 때문에 탐색적 테스트보다 체크리스트가 더 가치 있습니다.
이것은 여덟 영역으로 묶인 40개 항목 체크리스트이며, 각 항목 뒤에 구체적인 규칙이 있습니다. 주소 1행, 2행, 도시, 지역, 우편번호, 국가가 있는 양식을 가정하며, 이는 결제 및 가입 흐름의 대다수를 포괄합니다. 모든 항목은 백엔드에 접근하지 않고도 관찰할 수 있고, 모든 항목은 어딘가에서 실제로 배포된 결함에 대응합니다.
1. 필드 목록과 제약
먼저 모든 필드, 그 목적, 저장 한도, 필수 여부를 적어 두세요. 이 체크리스트의 결함 중 절반은 그 표 없이는 평가할 수 없습니다. "양식이 내 주소를 거부했다"는 어느 필드가 왜 거부했는지 알기 전까지는 실행 가능한 정보가 아니기 때문입니다.
제약은 전역이 아니라 국가별이어야 합니다. 우편번호 최대 길이를 10으로 하나로 정하면 대부분 국가에는 맞지만 아일랜드는 공백 포함 8자라 깨지고, 도시 최대 길이를 전역 30으로 정하면 실제 이름이 많이 잘립니다. 넉넉한 한도를 설정하고 한 시장을 기준으로 고른 길이가 아니라 국가 패턴으로 검증하세요.
| 필드 | 필수 조건 | 권장 최대 | 검증 방식 |
|---|---|---|---|
| 주소 1행 | 항상, 순수 PO Box 양식 제외 | 100자 | 자유 텍스트, trim 후 비어 있지 않음 |
| 주소 2행 | 없음 | 100자 | 자유 텍스트, 선택 사항 |
| 도시 | 항상 | 85자 | 자유 텍스트, 목록만 허용하지 않음 |
| 지역 | 국가에 지역이 있는 경우 | US와 CA는 3자 | 국가별 통제 목록 |
| 우편번호 | 국가에 우편번호가 있는 경우 | 12자 | 국가 패턴 |
| 국가 | 항상 | 2자 코드 및 이름 | 고정 목록 |
2. 국가 및 지역 의존성
국가를 변경하면 지역을 초기화하고, 우편번호 필드의 레이블을 바꾸고, 키보드와 패턴을 변경하고, 오래된 검증 상태를 지워야 합니다. 전형적인 버그는 미국으로 전환한 뒤에도 캐나다 주가 선택된 채로 남아, 유효해 보이지만 불가능한 값 조합으로 제출되는 것입니다.
홍콩과 아랍에미리트에는 우편번호가 없으므로 필드는 선택 사항이 되어야 하고 레이블에 그렇게 표시해야 합니다. 일본은 주소 순서가 반대이므로, 양식은 필드를 현지 순서로 제시하거나 서구식 순서를 기대한다는 점을 분명히 해야 합니다. 양방향 전환을 테스트하고, 검증 오류가 이미 표시된 후의 국가 전환도 테스트하세요.
| 국가 변경 | 예상 지역 목록 | 예상 우편번호 동작 |
|---|---|---|
| US에서 CA로 | 주 및 준주 | A1A 1A1 패턴, 공백 허용 |
| CA에서 US로 | DC 및 준주를 포함한 50개 주 | 5자리 또는 ZIP+4 |
| 어디서든 HK로 | 구 | 선택 사항, 빈 값 허용 |
| 어디서든 UAE로 | 에미리트 | 선택 사항, 빈 값 허용 |
| US에서 GB로 | 카운티 또는 자유 텍스트 | 아우트워드 및 인워드 코드 |
| GB에서 JP로 | 도도부현 | 3-4자리, 하이픈 허용 |
3. 검증 시점과 상태
형식은 blur 시 검증하고, 필수 필드는 제출 시 검증하며, 값이 유효해지는 즉시 오류를 지우세요. 키 입력마다 검증하면 우편번호를 입력하는 도중인 사용자를 괴롭히고, 제출 시에만 검증하면 사용자가 안내 없이 한 번에 여섯 개의 오류를 발견하게 됩니다.
검증 대신 제출 버튼을 비활성화하지 마세요. 설명 없는 비활성 버튼은 주소 양식에서 가장 흔한 접근성 불만입니다. 사용자는 무엇이 빠졌는지 알 수 없고 스크린 리더가 변경을 알리지 않을 수 있기 때문입니다. 버튼은 활성 상태로 두고, 제출하게 한 뒤 각 필드로 연결되는 요약을 표시하세요.
| 이벤트 | 검증 대상 | 표시 내용 |
|---|---|---|
| 변경 시 | 국가와 지역 일관성 | 종속 필드 초기화 |
| blur 시 | 포커스를 잃은 필드의 형식 | 유효하지 않으면 인라인 오류 |
| 오류 후 입력 시 | 재검사 후 수정되었으면 지움 | 오류 즉시 제거 |
| 제출 시 | 필수 포함 모든 필드 | 요약 및 첫 오류로 포커스 |
| 서버 응답 시 | 필드 수준 서버 오류 | 동일한 필드 id로 매핑 |
4. 오류 문구와 오류 위치
오류 메시지는 어느 필드가 잘못되었는지, 허용되는 형식은 무엇인지, 어떻게 고치는지를 말해야 합니다. "유효하지 않은 주소"는 세 가지 모두 실패합니다. "우편번호는 5자리여야 합니다. 예: 97205"는 통과합니다. 형식이 특이한 국가의 경우 사용자는 정규식을 읽지 않으므로 패턴 대신 예시를 포함하세요.
오류는 필드 옆에 두고, 양식이 길면 상단 요약에도 두세요. aria-describedby로 연결하고 입력에 aria-invalid를 설정하세요. 제출 시 첫 번째 잘못된 필드로 포커스를 이동하거나, 요약이 상호작용 가능하면 요약으로 이동하세요. 시각적으로만이 아니라 스크린 리더로 테스트하세요.
- 메시지에 필드 이름을 명시
- 예시와 함께 예상 형식 제시
- 무엇이 잘못되었는지뿐 아니라 무엇을 해야 하는지 설명
- 사용자를 탓하지 말고 "5자리 ZIP을 입력하세요"라고 안내
- 메시지를 페이지 언어와 방향에 맞게 유지
5. 입력 처리: 붙여넣기, 자동 완성, 키보드
붙여넣기는 형식 버그가 드러나는 지점입니다. 사용자가 줄바꿈 없는 공백이 포함된 "K1A 0B1"을 붙여넣거나 전체 주소를 1행에 붙여넣습니다. 양식은 trim하고 알려진 구분자를 정규화하며 내부 공백을 보존해야 합니다. ZIP+4나 네덜란드 코드에서 하이픈을 제거해서는 안 되고, 정당하게 대소문자가 섞인 도시 이름을 대문자로 바꿔서도 안 됩니다.
자동 완성은 올바른 토큰 이름에 달려 있습니다. address-line1, address-line2, 도시에는 address-level2, 지역에는 address-level1, postal-code, country를 사용하고, 단일 행 필드에 street-address를 재사용하지 마세요. 정말 여러 줄 주소 블록인 경우가 아니면 안 됩니다. 모바일에서 숫자 키보드에는 보통 하이픈이 없으므로 inputmode="numeric"으로 입력한 ZIP+4나 네덜란드 코드는 완성할 수 없게 됩니다. 패턴이 구분자를 허용하는 곳에서는 inputmode="text"를 사용하세요.
| 필드 | 자동 완성 토큰 | 모바일 키보드 |
|---|---|---|
| 주소 1행 | address-line1 | text |
| 주소 2행 | address-line2 | text |
| 도시 | address-level2 | text |
| 지역 | address-level1 | text 또는 선택기 |
| 우편번호 | postal-code | 하이픈이 허용되면 text |
| 국가 | country | 선택기 |
6. 길이, 잘림, 인코딩
모든 필드에 대해 경계값과 경계값보다 한 글자 더 긴 값을 테스트하세요. 잘림은 거부보다 나쁩니다. 사용자는 성공적으로 제출했다고 보지만 저장된 값은 잘못되기 때문입니다. 데이터베이스 컬럼이 50자인데 양식이 100자를 허용하면, 결함은 긴 입력에서만 나타나며, 이는 수작업 픽스처에 절대 포함되지 않는 바로 그런 경우입니다.
비ASCII 문자를 테스트하세요: 악센트 문자, O Connell의 아포스트로피, 프랑스 거리 이름의 하이픈, 독일 거리 이름의 에스체트, 오른쪽에서 왼쪽으로 쓰는 문자. 값이 API, 데이터베이스, CSV 내보내기, 인쇄 레이블을 거쳐 왕복되는지 확인하세요. 인코딩 버그는 종종 아무도 테스트하지 않는 내보내기 단계에서만 나타납니다.
- 경계: 최대값-1, 최대값, 최대값+1
- 악센트: e-acute, u-umlaut, c-cedilla
- 구두점: 아포스트로피, 하이픈, 거리 약어의 마침표
- 공백: 앞, 뒤, 이중, 줄바꿈 없는 공백
- 문자 체계: 방향용 아랍어와 히브리어, 폭용 일본어
- 왕복: 양식, API, 데이터베이스, 내보내기, 레이블
7. 접근성과 현지화
모든 필드에는 입력과 프로그래밍 방식으로 연결된 보이는 레이블이 필요합니다. 플레이스홀더 텍스트는 레이블이 아닙니다. 입력 시 사라지고 일관성 없이 읽히기 때문입니다. 주소 필드를 legend가 있는 fieldset으로 묶고, 국가 및 지역 선택을 키보드로 조작할 수 있게 하고 type-ahead를 제공하세요.
오른쪽에서 왼쪽으로 쓰는 로케일의 경우 개별 입력이 아니라 컨테이너에 dir을 설정하여 구두점과 오류 아이콘이 올바른 위치에 유지되게 하세요. 번역된 레이블이 200퍼센트 확대에서 넘치지 않는지, 오류 요약이 나타날 때 읽히는지 확인하세요. 이는 접근성 감사에서 비용을 청구하는 결함을 잡아내는 저렴한 점검입니다.
| 점검 | 통과 조건 |
|---|---|
| 레이블 연결 | 레이블을 클릭하면 입력에 포커스 |
| 오류의 Aria | aria-invalid true 및 aria-describedby가 메시지를 가리킴 |
| 포커스 순서 | Tab 순서가 시각적 순서를 따름 |
| 확대 | 200퍼센트에서 겹침 없이 레이아웃 작동 |
| RTL | 컨테이너에 방향 설정, 아이콘 미러링 |
| 스크린 리더 | 필드 이름, 값, 오류 모두 읽힘 |
8. 회귀 팩
체크리스트를 모든 변경 시 실행되는 작은 자동화 팩으로 바꾸세요. 스무 개의 케이스가 실패 집합을 커버합니다: 주요 시장의 유효 및 무효 케이스 각각 하나, 캐나다, 영국, 독일, 일본, 브라질, 홍콩, UAE 각각 하나, 경계 길이, 비ASCII 도시, 줄바꿈 없는 공백이 포함된 붙여넣기 값, 오류 후 국가 전환.
각 케이스를 독립적이고 시드되게 유지하세요. 리터럴 문자열이 아니라 결과의 형태를 검증하고, 무효 케이스의 경우 보이는 오류 텍스트를 검증하세요. 오류 문구 회귀는 실제 회귀이기 때문입니다. 이 정도 규모의 팩은 몇 초 안에 실행되며 위에서 설명한 결함의 대다수를 잡아냅니다.
| 케이스 그룹 | 개수 | 커버 |
|---|---|---|
| 주요 시장 유효 및 무효 | 4 | 핵심 경로 및 오류 문구 |
| 구조적 예외 | 7 | CA, GB, DE, JP, BR, HK, AE |
| 경계 길이 | 4 | 잘림 및 거부 |
| 인코딩 및 붙여넣기 | 3 | 비ASCII, NBSP, 전체 주소 붙여넣기 |
| 의존성 초기화 | 2 | 국가 전환, 오래된 값으로 새로고침 |
질문
- 약 스무 개면 일반적인 실패 집합을 커버합니다: 주요 시장의 유효 및 무효 케이스, 캐나다, 일본, 홍콩 같은 구조적 예외, 경계 길이, 인코딩, 국가 전환 초기화.
- 아니요. 형식은 blur 시, 필수 필드는 제출 시 검증한 뒤 값이 유효해지는 즉시 오류를 지우세요. 키 입력 검증은 입력 중인 사용자를 괴롭힙니다.
- 홍콩에는 우편번호가 없으므로 필수 우편번호 필드가 유효한 주소를 막습니다. 아랍에미리트도 마찬가지이며, 둘 다 필드를 선택 사항으로 만들어야 합니다.
- address-line1, address-line2, 도시에는 address-level2, 지역에는 address-level1, postal-code, country입니다. 브라우저가 양식을 올바르게 채울 수 있게 합니다.
- 최대 길이, 한 글자 적은 값, 한 글자 많은 값을 제출한 뒤 저장된 값을 다시 읽으세요. 성공적으로 제출된 후의 조용한 잘림이 잡아야 할 결함입니다.
주소 양식에는 테스트 케이스가 몇 개 필요한가요?+
키 입력마다 검증해야 하나요?+
홍콩이 주소 양식을 깨뜨리는 이유는 무엇인가요?+
주소 양식은 어떤 자동 완성 토큰을 사용해야 하나요?+
잘림은 어떻게 테스트하나요?+
예시는 합성 데이터입니다. 생성된 주소를 신원 확인, 계정 등록 또는 배송에 사용하지 마세요.