住所フォームのテストは、予測可能な箇所で失敗します。フィールドは単純なのでフォームはすぐに作られ、その後、カナダの郵便番号を静かに壊したり、ドイツの先頭ゼロを落としたり、ユーザーが香港を選んだのに州を要求したりします。ここでは探索的テストよりもチェックリストの方が価値があります。失敗の集合はよく知られており、有限だからです。
これは8つの領域に分けた40項目のチェックリストで、各項目の背後にある具体的なルールを示します。住所1行目、2行目、市区町村、地域、郵便番号、国を持つフォームを想定しており、これはチェックアウトとサインアップのフローの圧倒的大多数をカバーします。どの項目もバックエンドにアクセスせずに観察でき、それぞれがどこかで出荷されてしまった欠陥に対応しています。
1. フィールドの棚卸しと制約
まず、すべてのフィールド、その目的、保存上限、必須かどうかを書き出します。このチェックリストの欠陥の半分は、その表がなければ評価できません。「フォームが住所を拒否した」は、どのフィールドがなぜ拒否したかが分かるまで、対処可能な情報ではないからです。
制約はグローバルではなく国ごとにすべきです。郵便番号の最大長を一律10にするとほとんどの国では機能しますが、アイルランドはスペース込み8文字で破綻し、市区町村の最大長を一律30にすると実在の名前をかなり切り詰めます。余裕のある上限を設定し、1つの市場向けに選んだ長さではなく、国のパターンで検証してください。
| フィールド | 必須となる条件 | 推奨最大長 | 検証方法 |
|---|---|---|---|
| 住所1行目 | 常に必須(純粋なPO Boxフォームを除く) | 100文字 | 自由テキスト、trim後に空でないこと |
| 住所2行目 | 必須にしない | 100文字 | 自由テキスト、任意 |
| 市区町村 | 常に必須 | 85文字 | 自由テキスト、リストのみにしない |
| 地域 | 国に地域がある場合 | USとCAは3文字 | 国ごとの管理リスト |
| 郵便番号 | 国に郵便番号がある場合 | 12文字 | 国のパターン |
| 国 | 常に必須 | 2文字コード+名称 | 固定リスト |
2. 国と地域の依存関係
国を変更したら、地域をリセットし、郵便番号フィールドのラベルを変更し、キーボードとパターンを変え、古いバリデーション状態をクリアする必要があります。典型的なバグは、米国に切り替えた後もカナダの州が選択されたままで、有効に見えるフォームが不可能な値の組み合わせで送信されることです。
香港とアラブ首長国連邦には郵便番号がないため、フィールドは任意にし、ラベルでもその旨を示すべきです。日本は住所の順序が逆になるので、フォームは現地の順序でフィールドを提示するか、西洋式の順序を期待していることを明確にすべきです。切り替えは両方向でテストし、バリデーションエラーがすでに表示された後の国切り替えもテストしてください。
| 国の変更 | 期待される地域リスト | 期待される郵便番号の動作 |
|---|---|---|
| USからCA | 州と準州 | A1A 1A1パターン、スペース許可 |
| CAからUS | 50州+DC+準州 | 5桁またはZIP+4 |
| 任意からHK | 地区 | 任意、空を許可 |
| 任意からUAE | 首長国 | 任意、空を許可 |
| USからGB | カウンティまたは自由テキスト | アウトワードコードとインワードコード |
| GBからJP | 都道府県 | 3〜4桁、ハイフン許可 |
3. バリデーションのタイミングと状態
フォーマットはblur時に検証し、必須フィールドは送信時に検証し、値が有効になったらすぐにエラーをクリアします。キーストロークごとに検証すると、郵便番号を入力している途中のユーザーを罰することになり、送信時のみに検証すると、ユーザーは案内なしに一度に6つのエラーを発見することになります。
バリデーションの代わりに送信ボタンを無効にしないでください。説明のない無効化されたボタンは住所フォームで最もよくあるアクセシビリティの苦情です。ユーザーは何が足りないのか分からず、スクリーンリーダーが変更をアナウンスしない可能性があるからです。ボタンは有効のままにし、送信させ、各フィールドへのリンク付きのサマリーを表示してください。
| イベント | 検証する内容 | 表示する内容 |
|---|---|---|
| 変更時 | 国と地域の整合性 | 依存フィールドをリセット |
| blur時 | フォーカスを失ったフィールドのフォーマット | 無効ならインラインエラー |
| エラー後の入力時 | 再チェックし、修正済みならクリア | エラーを即座に削除 |
| 送信時 | 必須を含むすべてのフィールド | サマリーと最初のエラーへのフォーカス |
| サーバー応答時 | フィールド単位のサーバーエラー | 同じフィールドIDにマッピング |
4. エラー文言とエラーの配置
エラーメッセージは、どのフィールドが間違っているか、受け入れられるフォーマットは何か、どう修正するかを伝えなければなりません。「無効な住所」は3つすべてに失敗します。「郵便番号は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"を使用してください。
| フィールド | autocompleteトークン | モバイルキーボード |
|---|---|---|
| 住所1行目 | address-line1 | text |
| 住所2行目 | address-line2 | text |
| 市区町村 | address-level2 | text |
| 地域 | address-level1 | textまたはピッカー |
| 郵便番号 | postal-code | ハイフン許可時はtext |
| 国 | country | ピッカー |
6. 長さ、切り詰め、エンコーディング
すべてのフィールドで境界値とその1文字先をテストします。切り詰めは拒否よりも悪いです。ユーザーには送信成功が見えるのに、保存された値が間違っているからです。データベースの列が50文字でフォームが100文字を許可している場合、欠陥は長い入力でのみ現れます。それは手書きのフィクスチャには決して含まれないものです。
非ASCII文字をテストします:アクセント付き文字、O Connellのアポストロフィ、フランスの通りの名のハイフン、ドイツの通りの名のエスツェット、右から左へのスクリプト。値がAPI、データベース、CSVエクスポート、印刷ラベルを通じて往復することを確認します。エンコーディングのバグはエクスポートのステップでのみ現れることが多く、それは誰もテストしないステップです。
- 境界値:最大値マイナス1、最大値、最大値プラス1
- アクセント:e-acute、u-umlaut、c-cedilla
- 句読点:アポストロフィ、ハイフン、通りの略語のピリオド
- 空白:先頭、末尾、二重、非改行
- スクリプト:方向にはアラビア語とヘブライ語、幅には日本語
- 往復:フォーム、API、データベース、エクスポート、ラベル
7. アクセシビリティとローカライゼーション
すべてのフィールドには、入力にプログラム的に関連付けられた可視ラベルが必要です。プレースホルダーテキストはラベルではありません。入力すると消え、アナウンスも一貫しません。住所フィールドをlegend付きのfieldsetでグループ化し、国と地域のセレクトはキーボードとタイプアヘッドで操作可能にしてください。
右から左へのロケールでは、個々の入力ではなくコンテナにdirを設定し、句読点とエラーアイコンが正しい位置に留まるようにします。翻訳されたラベルが200パーセントのズームでオーバーフローしないこと、エラーサマリーが表示されたときにアナウンスされることを確認します。これらは、アクセシビリティ監査が費用を請求する欠陥を捕まえる安価なチェックです。
| チェック | 合格条件 |
|---|---|
| ラベルの関連付け | ラベルをクリックすると入力にフォーカスする |
| エラー時のaria | aria-invalidがtrueで、aria-describedbyがメッセージを指す |
| フォーカス順序 | タブ順序が視覚的な順序に従う |
| ズーム | 200パーセントで重なりなくレイアウトが機能する |
| RTL | 方向はコンテナに設定され、アイコンはミラーリングされる |
| スクリーンリーダー | フィールド名、値、エラーがすべてアナウンスされる |
8. 回帰テストパック
チェックリストを、変更のたびに実行される小さな自動化パックに変えます。20ケースで失敗の集合をカバーします:主要市場の有効ケースと無効ケースを1つずつ、カナダ、英国、ドイツ、日本、ブラジル、香港、UAEの各ケース、さらに境界長、非ASCIIの市区町村、非改行スペースを含む貼り付け値、エラー後の国切り替えです。
各ケースは独立させ、シードを設定します。結果の形状に対してアサートし、リテラル文字列に対してはアサートしません。無効ケースでは可視のエラーテキストに対してアサートします。エラー文言の回帰は実際の回帰だからです。このサイズのパックは数秒で実行され、上記の欠陥の大多数を捕まえます。
| ケースグループ | 件数 | カバー内容 |
|---|---|---|
| 主要市場の有効・無効 | 4 | コアパスとエラー文言 |
| 構造的な外れ値 | 7 | CA、GB、DE、JP、BR、HK、AE |
| 境界長 | 4 | 切り詰めと拒否 |
| エンコーディングと貼り付け | 3 | 非ASCII、NBSP、完全住所の貼り付け |
| 依存関係のリセット | 2 | 国切り替え、古い値でのリフレッシュ |
よくある質問
- 約20件で一般的な失敗の集合をカバーします:主要市場の有効・無効ケース、カナダ、日本、香港などの構造的な外れ値、境界長、エンコーディング、国切り替えのリセットです。
- いいえ。フォーマットはblur時に、必須フィールドは送信時に検証し、値が有効になったらすぐにエラーをクリアします。キーストロークごとの検証は入力途中のユーザーを罰します。
- 香港には郵便番号がないため、必須の郵便番号フィールドが有効な住所をブロックします。同じことがアラブ首長国連邦にも当てはまり、どちらもフィールドを任意にすべきです。
- address-line1、address-line2、市区町村にはaddress-level2、地域にはaddress-level1、postal-code、countryです。これによりブラウザがフォームを正しく入力できます。
- 最大長、1文字下、1文字上の値を送信し、保存された値を読み戻します。送信成功後のサイレントな切り詰めが捕まえるべき欠陥です。
住所フォームにはいくつのテストケースが必要ですか?+
バリデーションはキーストロークごとに実行すべきですか?+
なぜ香港は住所フォームを壊すのですか?+
住所フォームはどのautocompleteトークンを使うべきですか?+
切り詰めはどうテストしますか?+
例は合成データです。生成された住所を本人確認、アカウント登録、配送に使用しないでください。