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

## はじめに. 

2015.03.13, UIAutomator2.0のリリースアナウンスがあった. 
[We’re pleased to announce the release of UIAutomator 2.0!  - Google+](https://plus.google.com/+AndroidDevelopers/posts/WCWANrPkRxg)

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](http://developer.android.com/tools/testing-support-library/index.html)

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

UIAutomatorのAPI ReferenceおよびSample codeは下記. 
 - [android.support.test - Android Developers](http://developer.android.com/reference/android/support/test/package-summary.html)
 - [googlesamples android-testing - GitHub](https://github.com/googlesamples/android-testing)

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

転載元：[Yukiの枝折 - Android: UIAutomator 2.0](http://yuki312.blogspot.jp/2015/03/android-uiautomator20.html)

## 準備

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

```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を持つクラスを追加する. 
テストクラスのひな形は下記. 

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

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

}
```

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

```java
// 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テストシナリオを作成していく. 

以上.