オートスキャン
既存のUIテストがアプリと連携する際にアクセシビリティの問題を自動的に特定します
概要
オートスキャンは、既存のEspressoやUIAutomatorテストがアプリと連動する際にアクセシビリティの問題を自動的に識別します。個別のスキャン呼び出しやテストの変更を行う必要はありません。オートスキャンは画面の変化を検知し、各ユニークな画面を自動的にスキャンします。
テストでより詳細なコントロールが必要な場合は、ターゲットテストを参照してください。
仕組み
私たちのGradleプラグインは、JUnitインストゥルメンテーションランナーをカスタムランナーに置き換えます。これにより、テストスイートを観察し、適切なタイミングで結果を処理することができます。AxeDevToolsMobile Gradleプラグインを入手。
テストが終了すると、Auto Scanが結果を処理し、各画面のJSON結果とAxeDevToolsMobileResultsに自給自足型のHTMLレポートを保存し、オプションで結果をDeveloper Hubにアップロードします。
始めに
-
ユーザーの設定および認証のためにいくつかの値を設定する必要があります。キーを安全に保つために、これらをコンピュータおよびCI/CDパイプライン上の環境変数として追加することをお勧めします。
Groovy(
build.gradle):axeDevTools { axeMobileApiKey = '' axeAutoScanMode = true axeProjectId = '' }Kotlin DSL(
build.gradle.kts):axeDevTools { axeMobileApiKey = "" axeAutoScanMode = true axeProjectId = "" } -
私たちのツールを使用しオフラインモードで結果を取得することを希望する場合、
axeOfflineLicenseKeyに値を設定し、axeMobileApiKeyおよびaxeProjectIdの代わりに使用します。Groovy(
build.gradle):axeDevTools { axeOfflineLicenseKey = '' axeAutoScanMode = true }Kotlin DSL(
build.gradle.kts):axeDevTools { axeOfflineLicenseKey = "" axeAutoScanMode = true }
スキャン時に画面をスキップ
デフォルトでは、Auto Scanはテストの実行中にアプリ内の各ユニークな画面を確認します。特定の画面、例えば資格情報の画面やテスト対象外のナビゲーションなど、スキャンに含めるべきでない画面がある場合は、AxeAutoScan.skipScanでそのセクションをラップすることでスキャンを抑止できます。そのブロックが実行されている間、Auto Scanは画面の変更を監視するのを止め、ブロックが終了すると自動的に再開します。このブロック内に表示される画面は決してスキャンされません。
com.deque.mobile.devtools.productinterfaces.AxeAutoScanをインポートします。以下の実装例はJetpack Composeを用いていますが、EspressoやUIAutomatorのテストにおいても動作は同じです。
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import com.deque.mobile.devtools.productinterfaces.AxeAutoScan
import org.junit.Rule
import org.junit.Test
class AutoScanDemoTest {
@get:Rule
val composeTestRule = createAndroidComposeRule<MainActivity>()
@Test
fun homeLoggedIn() {
AxeAutoScan.skipScan {
// Navigation to Login screen
composeTestRule.onNodeWithText("Sign in").performClick()
// Username/password entry
composeTestRule.onNodeWithTag("username").performTextInput("test@example.com")
composeTestRule.onNodeWithTag("password").performTextInput("password")
// Submit form data
composeTestRule.onNodeWithText("Submit").performClick()
// Wait to return to Home screen
composeTestRule.waitUntil(timeoutMillis = 5_000) {
composeTestRule.onAllNodesWithTag("home_screen")
.fetchSemanticsNodes().isNotEmpty()
}
}
// Auto Scan starts again - after return to Home screen everything is captured
composeTestRule.onNodeWithTag("account_menu").performClick()
}
}skipScanについて注意すべき項目:
- ブロック内でアサーションが失敗しても、スキャンは再開されます。Auto Scanは、エラーが伝播する前に再び開始されます。
"axeAutoScanMode" = falseのときにskipScanを呼び出しても問題ありません。この呼び出しを警戒したり、テストの2つのバージョンを保持する必要はありません。
結果の解釈
コンソール要約
テストスイートが終了すると、Gradleログ内でポストプロセスが見られ、その後要約が表示されます。
HTML rule report written to: /Users/user/Documents/workspace/android/project-name/app/build/reports/AxeDevToolsMobileResults/AxeDevToolsMobile_1773882427726.html
---- Axe DevTools Mobile Accessibility Summary ----
Scan 1:
Screen: Home Page
Issues: 6
Issues by rule:
- TouchSizeWcag: 3
- LabelAtFront: 1
- LabelInName: 1
- FocusableText: 1
Scan 35:
Screen: Wikipedia Alpha
Issues: 5
Issues by rule:
- LabelAtFront: 1
- LabelInName: 1
- TouchTargetSpacing: 1
- TouchSizeWcag: 1
- ColorContrast: 1
Total Scans: 35
❌ Total Issues: 123
---------------------------------------------------出力ファイル
Auto Scanは、スクリーンショット、ビュー階層データ、および詳細な問題情報を含む自給自足型のHTMLレポートを生成します。個々のJSON結果はaxe-test-dataディレクトリに保存されます。すべてのファイルは、app/build/reports/AxeDevToolsMobileResultsディレクトリに保存されます。
| ファイル | 形式 |
|---|---|
AxeDevToolsReport.html |
各画面の問題、要素の詳細、影響レベルを含むインタラクティブなHTMLレポート |
<timestamp>-axe-node-hierarchy.json |
各スキャンごとに1つの個別JSON結果 |
結果を特定のディレクトリに保存することを希望する場合は、build.gradleファイルのプラグイン設定ブロックでこれを指定できます。
axeDevTools {
axeMobileApiKey = "AXE_API_KEY"
axeProjectId = "DEVHUB_PROJECT_ID"
axeAutoScanMode = true
axeHtmlReportPath =
"User/Desktop/reports/AxeDevToolsMobileResults"
axeAccountUrl = "https://axe.deque.com"
オートスキャンサポート
ルール
Auto ScanはScreenOrientationを除く完全なAxeルールセットを実行します。Androidのルール概要で確認している詳細情報を見つけましょう。
開発者ハブ
Auto Scanは、結果をAxe Developer Hubに自動的にアップロードします。ローカルにのみ結果を保存したい場合は、axeUploadResultsをfalseに設定します。
設定リファレンス
プロパティ
| プロパティ | タイプ | 必須 | 詳細 |
|---|---|---|---|
axeAutoScanMode |
ブール値 | 必須 | デフォルトはfalseです。オートスキャンを有効にするにはtrueに設定する必要があります。 |
axeMobileApiKey |
文字列 | 必須* | axe.deque.comからのAxe DevTools Mobile APIキーは必要ですがある場合axeUploadResults=true |
axeOfflineLicenseKey |
文字列 | 必須* | オフラインモードの場合にのみ必要です。axeUploadResults=falseのとき |
axeUploadResults |
ブール値 | 任意 | デフォルトはtrueです。ローカル結果のみの場合はfalseに設定します |
axeProjectId |
文字列 | 任意 | Developer HubからのプロジェクトIDは必要ですがある場合axeUploadResults=true |
axeServerUrl(非推奨) |
文字列 | 任意 | カスタムバックエンドURL(例: axe.company.com)、オンプレミス/プライベートクラウドのみ |
axeAccountUrl |
文字列 | 任意 | カスタムバックエンドURL(例: axe.company.com)、オンプレミス/プライベートクラウドのみ |
axeHtmlReportPath |
文字列 | 任意 | HTMLレポートとサマリーのためのユーザー設定可能な出力ディレクトリ。デフォルトはbuild/reports/AxeDevToolsMobileResults |
axeOfflineLicenseKey |
文字列 | 任意 | オフラインモードの場合にのみ必要です。axeUploadResults=falseのとき |
* 注:設定でaxeMobileApiKeyまたはaxeOfflineLicenseKeyのいずれかを設定する必要があります。APIキーは、オフラインモードを使用しない限り必須です。オフラインモードの場合は、オフラインライセンスキーが必要です。
ベストプラクティス
アニメーションの無効化
アニメーションを無効にすることで、自動スキャンから最も正確で包括的な結果を得ることができます。これにより、スクリーンがキャプチャ時に完全にレンダリングされるようになります。アニメーションが無効になっていないと、以下のようなことに気づくかもしれません:
- 削除されるはずの重複スキャン
- 通過状態を示すスクリーンショットを持つスキャン
- 期待よりも著しく低いスクリーンキャプチャ率
トラブルシューティング
Developer Hubでスキャンが表示されない場合は、ログを確認して問題の手がかりを探るか、このチェックリストを確認してください。
axeAutoScanMode=trueがあなたのaxeDevTools設定ブロックであることを確認してください- Maven Centralから依存関係を取得できたことを確認してください
- API/ライセンスキーおよびプロジェクトIDに正しい変数を使用しているか確認してください
- 出力ファイルのサイズをご確認ください。結果ファイルのいずれかのサイズが20MBを超えると、Developer Hubへのアップロードに失敗しますが、すべての結果はローカルに保存され、ローカルのHTMLレポートに表示されます。
次はどうしますか?
Axe Developer Hubで結果を確認できます。CI/CDパイプラインにAxe DevTools Mobileを統合する方法を学びましょう。クラウドベースのテストプラットフォームを使用していますか? それでもAxe DevTools Mobileを使用してアクセシビリティの問題を検索できます:クラウドプラットフォームとの統合。
