12
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

UIAutomator2.0を使ったAndroid UI Testの準備

Last updated at Posted at 2015-03-19

はじめに.

2015.03.13, UIAutomator2.0のリリースアナウンスがあった.
We’re pleased to announce the release of UIAutomator 2.0! - Google+

UIAutomator2.0はAndroid Instrumentationベースに生まれ変わり, ./gradlew connectedCheckコマンドでテスト実行することができるようになった.

UIAutomator2.0はAndroid Testing Support Libraryにパッケージされた. UIAutomator2.0の導入にはSDK ManagerからAndroid Support Repositoryをダウンロードすること.

UIAutomatorはAndroid Developersサイトでも記載されている.
Testing Support Library - Android Developers

NOTE
類似のUI Testing Framework "Espresso"は1つのアプリに絞ったTesting Frameworkであるため, きめ細やかな制御が可能.
一方, "UI Automator"は複数のアプリを跨いだクロスアプリケーションテストが可能

UIAutomatorのAPI ReferenceおよびSample codeは下記.

UIAutomatorは Requires Android 4.3 (API level 18) or higher.

転載元:Yukiの枝折 - Android: UIAutomator 2.0

準備

まずはbuild.gradleを編集する.

android {
    defaultConfig {
        minSdkVersion 18  // Requires Android 4.3 (API level 18)
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    packagingOptions {
        exclude 'LICENSE.txt'  // Duplicate files copied
    }
}

dependencies {
    // Testing-only dependencies
    androidTestCompile 'com.android.support.test:testing-support-lib:0.1'
    // UiAutomator Testing
    androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.0.0'
}

現状, そのままビルドするとLICENSE.txtの重複コピーでエラーが出るためpackagingOptionsを指定する. minSdkVersionの設定と必要なライブラリが揃えばandroidTestフォルダにTestCaseを持つクラスを追加する.
テストクラスのひな形は下記.

import android.support.test.filters.SdkSuppress;
import android.support.test.runner.AndroidJUnit4;

@RunWith(AndroidJUnit4.class)
@SdkSuppress(minSdkVersion = 18)
public class ApplicationTest {

}

サンプルコードを参考にすればすぐにでもUIテストを開始できる.
下記はランチャーからテスト対象のアプリを起動するまでのSetup処理.

// Copyright 2015, The Android Open Source Project

@Before
public void startMainActivityFromHomeScreen() {
        // Initialize UiDevice instance
        mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());

        // Start from the home screen
        mDevice.pressHome();

        // Wait for launcher
        final String launcherPackage = getLauncherPackageName();
        assertThat(launcherPackage, notNullValue());
        mDevice.wait(Until.hasObject(By.pkg(launcherPackage).depth(0)), LAUNCH_TIMEOUT);

        // Launch the blueprint app
        Context context = InstrumentationRegistry.getContext();
        final Intent intent = context.getPackageManager()
                .getLaunchIntentForPackage(BASIC_SAMPLE_PACKAGE);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);    // Clear out any previous instances
        context.startActivity(intent);

        // Wait for the app to appear
        mDevice.wait(Until.hasObject(By.pkg(BASIC_SAMPLE_PACKAGE).depth(0)), LAUNCH_TIMEOUT);
    }

APIs

UIAutomatorではデバイスへのファサードとしてUiDeviceクラスを定義している.
UiDeviceクラスを使えは次のことも実現できる.

  • Change the device rotation
  • Press a D-pad button
  • Press the Back, Home, or Menu buttons
  • Open the notification shade
  • Take a screenshot of the current window

UIAutomator APIには次のクラスが定義される.

  • UiCollection: Enumerates a container's UI elements for the purpose of counting, or targeting sub-elements by their visible text or content-description property.
  • UiObject: Represents a UI element that is visible on the device.
  • UiScrollable: Provides support for searching for items in a scrollable UI container.
  • UiSelector: Represents a query for one or more target UI elements on a device.
  • Configurator: Allows you to set key parameters for running UI Automator tests.

これらを駆使してUIテストシナリオを作成していく.

以上.

12
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?