Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Introducing Android Accessibility Test with Accessibility Testing Framework

itome
June 28, 2019

Introducing Android Accessibility Test with Accessibility Testing Framework

itome

June 28, 2019
Tweet

More Decks by itome

Other Decks in Technology

Transcript

  1. Accessibility Testing Frameworkの導⼊ 5min ‧Accessibility TestingFramework for Androidとは  - 名前の通り、Androidアプリのアクセシビリティを⾃動でテストする

    ライブラリ - Viewの階層を分析して、アクセシブルでない要素があると教えてくれる - EspressoとRobolectricと連携する機能がある
  2. Accessibility Testing Frameworkの導⼊ 5min ‧導⼊⽅法 import androidx.test.espresso.contrib.AccessibilityChecks @RunWith(AndroidJUnit4::class) @LargeTest class

    AccessibilityChecksIntegrationTest { companion object { @BeforeClass @JvmStatic fun enableAccessibilityChecks() { AccessibilityChecks.enable() } } } UIのテストクラスで、AccessibilityChecksを有効化する
  3. Accessibility Testing Frameworkの導⼊ 5min ‧テストできる項⽬ ClickableViewSpanCheck - URLSpan(テキストに含まれるリンク)に関するチェック - URLが絶対パスになっているか、ClickableSpanの中で使われて

    いるかをチェックしてくれる DuplicateClickableBoundsViewCheck - ボタンのタッチ領域が排他的になっているか(重なっていないか) をチェックしてくれる
  4. Accessibility Testing Frameworkの導⼊ 5min ‧テストできる項⽬ DuplicateSpeakableTextViewHierachyCheck - TalkBackの読み上げが同じになっているViewがないかをチェック してくれる EditableContentDescriptionViewCheck

    - 編集可能なTextViewにContentDescriptionが付いていないかチェック してくれる  (編集可能なTextViewのTalkbackは android:hint で提供されるため)
  5. 実際にやってみる 4min ‧テストクラス @RunWith(AndroidJUnit4::class) @LargeTest class MainActivityTest { companion object

    { @BeforeClass @JvmStatic fun enableAccessibilityChecks() { AccessibilityChecks.enable() .setRunChecksFromRootView(true) } } @Test fun testAccessibility() { ActivityScenario.launch(MainActivity::class.java).onActivity { onView(withId(R.id.button_small)).perform(click()) } } }
  6. 実際にやってみる 4min ‧テストクラスを⾛らせるとエラーが発⽣ java.lang.NoSuchMethodError: com.google.android.apps.common.testing.accessibility.framework.integrations.espresso.AccessibilityValidato r.checkAndReturnResults(Landroid/view/View;)Lcom/google/common/collect/ImmutableList; at androidx.test.espresso.accessibility.AccessibilityChecks$2.check(AccessibilityChecks.java:65) at androidx.test.espresso.action.ViewActions$1.perform(ViewActions.java:130)

    at androidx.test.espresso.ViewInteraction$SingleExecutionViewAction.perform(ViewInteraction.java:366) at androidx.test.espresso.ViewInteraction.doPerform(ViewInteraction.java:255) at androidx.test.espresso.ViewInteraction.access$100(ViewInteraction.java:65) ライブラリの中で使われているjava.util.ListがなぜかGuavaのListとして扱われている → 解決できず(泣)
  7. 実際にやってみる 4min ‧解決⽅法(あくまでワークアラウンド) object AccessibilityChecker { fun check(root: View?, ignore:

    Matcher<in AccessibilityViewCheckResult>? = null) { if (root == null) throw NullPointerException() val validator = AccessibilityValidator() .setResultDescriptor(object : AccessibilityCheckResult.AccessibilityCheckResultDescriptor() { override fun describeView(view: View?): String { return HumanReadables.describe(view) } }) .setSuppressingResultMatcher(ignore) val originalPolicy = StrictMode.allowThreadDiskWrites() try { validator.checkAndReturnResults(root) } finally { StrictMode.setThreadPolicy(originalPolicy) } } }
  8. 実際にやってみる 4min ‧解決⽅法(あくまでワークアラウンド) @RunWith(AndroidJUnit4::class) @LargeTest class MainActivityTest { @Test fun

    testAccessibility() { ActivityScenario.launch(MainActivity::class.java).onActivity { activity -> AccessibilityChecker.check(activity.findViewById(android.R.id.content)) } } }
  9. 実際にやってみる 4min ‧テスト結果 com.google.android.apps.common.testing.accessibility.framework.integrations.AccessibilityViewCheckExcept ion: There was 1 accessibility error:

    AppCompatTextView{ id=2131165219, res-name=button_small, visibility=VISIBLE, width=27, height=32, has-focus=true, has-focusable=true, has-window-focus=true, is-clickable=true, is-enabled=true, is-focused=true, is-focusable=true, …… input-type=0, ime-target=false, has-links=false }: View falls below the minimum recommended size for touch targets. Minimum touch target size is 48x48dp. Actual size is 27x32dp.
  10. 実際にやってみる 4min ‧テスト結果 com.google.android.apps.common.testing.accessibility.framework.integrations.AccessibilityViewCheckExcept ion: There was 1 accessibility error:

    AppCompatTextView{ id=2131165219, res-name=button_small, visibility=VISIBLE, width=27, height=32, has-focus=true, has-focusable=true, has-window-focus=true, is-clickable=true, is-enabled=true, is-focused=true, is-focusable=true, …… input-type=0, ime-target=false, has-links=false }: View falls below the minimum recommended size for touch targets. Minimum touch target size is 48x48dp. Actual size is 27x32dp.