Androidアプリのユーザ補助機能テストについて

#はじめに - モバイル端末のa11yについて
Webでは活発であったアクセシビリティを踏まえた開発は近年のモバイル端末の使用者増加によって、モバイル端末でも必要とされ始めています。アプリ開発者はこれを踏まえた上での開発や、開発ずみのアプリのさらなるユーザへの改善としてユーザ補助機能を高めることが必要になってきています。

今回は自学のためandroid developers documentからユーザ補助に関するドキュメントをざっと全体をみてまとめていきます。参考は最後にリンクを貼っていますので、詳しくはそちらから見てください。

## Androidで提供されているユーザ補助機能
Androidでは端末に備わっているユーザ補助機能として以下の二つが挙げられます。

- TalkBack: 視力の弱いユーザーや目の不自由なユーザーをサポートします。合成音声でコンテンツを知らせ、ユーザーの操作に応じてアプリでアクションを実行します。
- スイッチ アクセス: 運動障がいのあるユーザーをサポートします。インタラクティブな要素をハイライト表示し、ユーザーのボタン押下に応じてアクションを実行します。1 つまたは 2 つのボタンを使用するだけでデバイスを制御できます。


## 今回の記事
やはりテストというものは大事ということで、ユーザ補助機能のテストについてまとめます。
この記事は自身の勉強も兼ねているため、公式文章の重ね書きになる部分もありますがご了承ください。
参考はこちらになります。https://developer.android.com/guide/topics/ui/accessibility/testing

今回説明するのはエンジニアの方にも一般的なコード上のテストだけではなく、ユーザの動作を体験するために、手動でユーザ補助サービスを使用してアプリを操作してみるといいうものも含まれています。
現実的に使用に足るアプリになっているのかということは使用しないとわかりません。エッジユーザかもしれませんが、実際に使ってみることで理解が深まります。Androidのユーザ補助機能の使用方法はいかにまとめてありますので、そちらもご参考ください。
[AndroidのTalkBack機能についてまとめる（基本操作について編）](https://qiita.com/airagu950/items/2f9eccb5c1982846beef)

- TBD
    - 参考：https://support.google.com/accessibility/android/answer/6122836

もちろんコード上からのテストもありますので、ご安心ください。

## テスト方法
### 手動テスト
> 手動テスト: Android ユーザー補助サービスを使用してアプリを操作します。

Androidのユーザ補助機能はいくつかあります。
代表的なものはTalkBackやスイッチコントロールですが、公式ドキュメントにはBrailleBackやVoice Accessも紹介されています。
それぞれのユーザ補助機能の使用方法は以前まとめたQiitaや公式ドキュメントにもありますので、そちらをご参照ください。

#### TalkBack
- [AndroidのTalkBack機能についてまとめる（基本操作について編）](https://qiita.com/airagu950/items/2f9eccb5c1982846beef)
- [developers]()

developersによると確認すべき点として以下のものがあるとされています
>各要素の音声フィードバックにより、コンテンツや目的が適切に伝わるか（わかりやすいラベルの付け方をご覧ください）。
案内は簡潔か。冗長になっていないか。
メインのワークフローを簡単に完了できるか。
スワイプですべての要素にアクセスできるか。
アラートなどの一時的なメッセージが表示された場合、それも読み上げられるか。

また、テストを用意にする方法として以下の方法があるとされています。
設定＞　ユーザ補助＞　TalkBack＞　設定＞　デベロッパー向け設定にて

- ログ出力レベルをVERBOSEへ変更可能
- 音声出力を画面に表示する

#### スイッチコントロール
- TBD
- [developers](https://support.google.com/accessibility/android/answer/6122836)

スイッチコントロールは運動障がいのある方へのユーザ補助機能として提供されています。スイッチとしてはAbleNet、Enabling Devices、RJ Cooper、Teclaから販売されている支援技術デバイスやキーボード、Androidの音声ボタンなどがあります。

#### その他
- [BrailleBack](https://play.google.com/store/apps/details?id=com.googlecode.eyesfree.brailleback)

BrailleBackとは点字ディスプレイとAndroidデバイスを接続し、アプリで使用可能にするためのアプリです。BrailleBackとTalkBackを組み合わせることで点字と音声を組み合わせたユーザ補助機能をユーザに提供することができます。


- [VoiceAccess](https://play.google.com/store/apps/details?id=com.google.android.apps.accessibility.voiceaccess)

ユーザ補助機能には音声コマンドで操作を可能にするものもあります。Voice AccessはAndroid5.0（API21）以上から使用できるアプリです。こちらのテストの方法は公式のスタートアップテキストの中に記述されているそうです。
https://support.google.com/accessibility/android/answer/6151848

### 分析ツールによるテスト
> 分析ツールによるテスト: ツールを使用してアプリのユーザー補助機能の改善点を見つけ出します。

Googleはユーザ補助機能を実際のアプリで検証するための[ユーザ補助機能検証ツール](https://play.google.com/store/apps/details?id=com.google.android.apps.accessibility.auditor)を提供しています。

ユーザ補助機能検証ツールはアプリのユーザ補助機能について改善点を提供してくれます。

- コンテンツラベル
    - コンテンツラベルの欠落
    - コンテンツラベルの重複
    - リンクテキストの不明確さ


- 実装上の不備
    - [クリック可能なリンク](https://support.google.com/accessibility/android/answer/6378148)について
    - [クリック可能なリンクの重複について](https://support.google.com/accessibility/android/answer/6378943)
    - ユーザ補助機能でサポートされていないアイテムについて

- タップターゲットのサイズについて
- 低コントラストについて
    - テキストの色と背景色（TextView が空欄ではない場合）または前景色と背景色（ImageView の場合）のコントラスト比が 3.0 未満のテキストや画像を特定します。
    - ユーザ補助機能検証ツールの中で最小比率を設定できます。

また、これらの**検証結果はGoogle Playのリリース前レポート、 [ユーザー補助機能] タブからも確認**することができます。テストは[アクセシビリティテストフレームワーク](https://github.com/google/Accessibility-Test-Framework-for-Android)に基づいて行われます。

さらに、これらの実装上で提供すべきユーザ補助機能はコード上で**lintによっても開発者にフィードバック**されます。
最もよくみられるlintとしては"画像にcontentnDescription属性がありません"などが挙げられます。

### 自動テスト
> 自動テスト: Espresso と Robolectric でユーザー補助機能テストを有効にします。

Androidのアクセシビリティテストフレームワークは上記の二つのテストフレームワークをサポートしています。概要については以下の動画を確認することができます。
[インクルーシブな設計とテスト: アプリをあらゆるユーザーにとってより使いやすいものにする（Google I/O 2016）](https://www.youtube.com/watch?v=SOZwfQO4rVM&t=31m54s)

#### Espresso
Espressoのテストコードを書く際にアクセシビリティについてのテストを追加することができます。以下のコードのようにAccessibilityChecksを使用します。

```test.kt

import androidx.test.espresso.contrib.AccessibilityChecks

@RunWith(AndroidJUnit4::class)
@LargeTest
class MyWelcomeWorkflowIntegrationTest {
    companion object {
        @Before @JvmStatic
        fun enableAccessibilityChecks() {
            AccessibilityChecks.enable()
        }
    }
}
```

また、実装上でテストを行うものの**すぐに対応できないような改善点**がみつかることもあります。
その場合はテストが失敗しないように一時的に**テスト結果を抑制する**ことができます。
ユーザ補助機能フレームワークでは`setSuppressingResultMatcher`（[github code](https://github.com/google/Accessibility-Test-Framework-for-Android/blob/a6117fe0059c82dd764fa628d3817d724570f69e/src/main/java/com/google/android/apps/common/testing/accessibility/framework/AccessibilityCheckResultUtils.java)）を使用することによって可能です。
次の例では、1 つの TextView 要素の色のコントラストに関連するチェックの結果を抑制します。要素の ID は countTV です。

```testMaches.kt
AccessibilityChecks.enable().apply {
        setSuppressingResultMatcher(
                allOf(
                    matchesCheckNames(`is`("TextContrastViewCheck")),
                    matchesViews(withId(R.id.countTV))
                )
        )
}
```

#### Robolectric

>注: Robolectric による UI テストのみでは不十分なため、これに加えて他の形式のテストも行う必要があります。たとえば、Robolectric からは、タップ ターゲットのサイズやクリック可能なアイテムの重複について信頼できる結果が得られません。このような問題を検出するには、ユーザー補助検証ツールアプリの使用を検討してください。

詳細に関しては公式サイトの[Getting Started](http://robolectric.org/getting-started/)を参考にして下さい。


### ユーザーテスト
> ユーザーテスト: 実際にアプリを操作したユーザーからフィードバックを受けます。

これは実際に障がいをもったユーザの人にユーザテストを行いその結果をFBされることによって具体的かつ有益な情報をえるという方法です。近年ではZoom上にAndroidデバイスの画面を画面共有し、ユーザの表情や手元、画面デバイスを同時に閲覧しつつ、遠距離でもユーザテストが行えるようになりました。


## おわりに
今回はandroid developer documentの中のユーザ補助機能のテストについてをまとめました。
今後のシリーズとしてドキュメントの中にある他の補助機能を高める方法についてもまとめます。
興味がある方は、次も読んでいただければと思います。ありがとうございました。


# 参考
- https://developer.android.com/guide/topics/ui/accessibility/testing
- https://github.com/google/Accessibility-Test-Framework-for-Android/blob/a6117fe0059c82dd764fa628d3817d724570f69e/src/main/java/com/google/android/apps/common/testing/accessibility/framework/AccessibilityCheckResultUtils.java
- https://github.com/google/Accessibility-Test-Framework-for-Android/blob/a6117fe0059c82dd764fa628d3817d724570f69e/src/main/java/com/google/android/apps/common/testing/accessibility/framework/AccessibilityCheckResultUtils.java
- http://robolectric.org/getting-started/
- https://play.google.com/store/apps/details?id=com.google.android.apps.accessibility.auditor
- https://support.google.com/accessibility/android/answer/6376559?hl=ja&ref_topic=6376582
- https://support.google.com/accessibility/android/answer/6378148
- https://support.google.com/accessibility/android/answer/6378943
- https://github.com/google/Accessibility-Test-Framework-for-Android