アプリのユーザー補助機能をテストする(ビュー)

コンセプトと Jetpack Compose の実装

ユーザー補助機能をテストすることで、ユーザーの立場でアプリを体験し、見逃しがちな使い勝手の問題を見つけることができます。また、障がいのあるユーザーのみにとどまらず、すべてのユーザーにとって有用で使いやすいアプリにするためのヒントが得られます。

このドキュメントでは、次の方法について説明します。

  • 分析ツールを使用したテスト: ツールを使用してアプリのユーザー補助機能の改善点を見つけ出します。
  • 自動テスト: Espresso と Robolectric でユーザー補助機能テストを有効にします。

分析ツールを使用したテスト

分析ツールを使用すると、手動テストでは見逃されがちなユーザー補助機能改善のヒントを発見できます。

ユーザー補助検証ツール

ユーザー補助検証ツールは、画面をスキャンしてアプリのユーザー補助機能を改善する方法を提案するアプリです。ユーザー補助機能テスト フレームワークを使用し、コンテンツ ラベル、操作可能なアイテム、コントラストなどの確認結果に基づいて具体的な提案を行います。

Android Studio に統合されている Android ユーザー補助機能テスト フレームワークを使用すると、レイアウト内のユーザー補助機能の問題を発見できます。パネルを起動するには、エラー報告ボタン ! をクリックします。をクリックします。

ユーザー補助検証ツールのデモ 図 1. ユーザー補助検証ツールのデモ

詳細については、以下のリソースをご覧ください。

UI Automator ビューア

uiautomatorviewer ツールは、Android 搭載デバイスに現在表示されている UI コンポーネントをスキャンして分析するのに便利な GUI を備えています。このツールを使用して、レイアウト階層を検査し、デバイスのフォアグラウンドに表示される UI コンポーネントのプロパティを確認できます。この情報から、特定の表示プロパティとマッチングする UI セレクタを作成するなど、よりきめ細かなテストを作成できます。このツールは、Android SDK の tools ディレクトリにあります。

ユーザー補助機能のテストにおいて、このツールは他のテスト方法で見つかった問題をデバッグするのに役立ちます。手動テストにより、たとえばテキストが読み上げられるべきビューで読み上げられなかった場合や、フォーカスされないはずのビューがフォーカスされた場合に、このツールを使って問題の原因を特定できます。

UI Automator ビューアの詳細については、UI Automator で自動テストを作成するをご覧ください。

lint

Android Studio では、ユーザー補助機能のさまざまな問題について lint 警告が表示され、ソースコード内の該当箇所へのリンクが提示されます。次の例では、画像に contentDescription 属性がありません。コンテンツの説明が欠けている場合、次のメッセージが表示されます。

[Accessibility] Missing 'contentDescription' attribute on image

図 2 に、Android Studio でのこのメッセージの表示例を示します。

一部の画像にコンテンツの説明がないことを示す Android Studio のメッセージ。
図 2. contentDescription 属性が欠けていることを示す Android Studio のメッセージ

自動テスト

Android プラットフォームは、Espresso をはじめいくつかのテスト フレームワークをサポートしています。Espresso を使用すると、アプリのユーザー補助機能を評価するための自動テストを作成、実行できます。

Espresso

Espresso は、UI テストを迅速かつ簡単に行えるように設計された Android テスト ライブラリです。これを使用すると、テスト中のアプリの UI コンポーネントとやり取りし、特定の動作が発生したことや、特定の条件が満たされたことを確認できます。

Espresso を使用したユーザー補助機能テストに関する概要動画を見るには、次の動画の 31:54 から 34:19 までをご覧ください: インクルーシブな設計とテスト: アプリをあらゆるユーザーにとってより使いやすいものにする(Google I/O 2016)

このセクションでは、Espresso を使用してユーザー補助機能チェックを実行する方法について説明します。

チェックを有効にする

次のように AccessibilityChecks クラスを使用して、ユーザー補助機能テストを有効化し、設定できます。

Kotlin

import androidx.test.espresso.accessibility.AccessibilityChecks

@RunWith(AndroidJUnit4::class)
@LargeTest
class MyWelcomeWorkflowIntegrationTest {
    init {
        AccessibilityChecks.enable()
    }
}

Java

import androidx.test.espresso.accessibility.AccessibilityChecks;

@RunWith(AndroidJUnit4.class)
@LargeTest
public class MyWelcomeWorkflowIntegrationTest {
    @BeforeClass
    public void enableAccessibilityChecks() {
        AccessibilityChecks.enable();
    }
}

デフォルトでは、ViewActions で定義されたビュー アクションを行うと、このチェックが実行されます。チェックの範囲には、アクションを行ったビューと、そのすべての子孫ビューが含まれます。次のコード スニペットに示すように、truesetRunChecksFromRootView() に渡すことで、それぞれのチェックを行っている間に画面のビュー階層全体を評価できます。

Kotlin

AccessibilityChecks.enable().setRunChecksFromRootView(true)

Java

AccessibilityChecks.enable().setRunChecksFromRootView(true);

結果の一部を抑制する

Espresso がユーザー補助機能チェックを実行した後、すぐには対応できない改善点が見つかることがあります。その結果が原因で Espresso テストの失敗が続かないように、一時的にテストを無視できます。ユーザー補助機能テスト フレームワーク(ATF)では、setSuppressingResultMatcher() メソッドでこの機能を使用できます。このメソッドは、指定されたマッチャー式を満たす結果を抑制するように Espresso を設定します。

ユーザー補助機能の 1 つの観点に対処する変更をアプリに加えるとき、他の観点に関する結果をできるだけ多く Espresso に表示させるのが有益です。そのため、特定の改善点のみ抑制することをおすすめします。

後で対処することを予定しているユーザー補助機能テスト結果の表示を一時的に抑制するときは、似たような結果を誤って抑制しないようにすることが重要です。このために、範囲を限定したマッチャーを使用します。具体的には、次のユーザー補助機能チェックのそれぞれを満たす場合にのみ結果を抑制するように、マッチャーを選びます。

  1. タッチ ターゲットのサイズを確認するなど、特定タイプのユーザー補助機能チェック。
  2. ボタンなどの特定の UI 要素を評価するユーザー補助機能チェック。

Espresso テストで表示する結果を定義するために、ATF で定義されているマッチャーを利用できます。次の例では、1 つの TextView 要素の色のコントラストに関連するチェックの結果を抑制します。要素の ID は countTV です。

Kotlin

AccessibilityChecks.enable().apply {
        setSuppressingResultMatcher(
                allOf(
                    matchesCheck(TextContrastCheck::class.java),
                    matchesViews(withId(R.id.countTV))
                )
        )
}

Java

AccessibilityValidator myChecksValidator =
    AccessibilityChecks.enable()
        .setSuppressingResultMatcher(
            allOf(
                matchesCheck(TextContrastCheck.class),
                matchesViews(withId(R.id.countTV))));