appiumでAndroid実機の自動受け入れテストをRubyで書く

## 環境
- ruby 2.1.0
- npm 1.1.62
- Android 4.2.2
- Mac OS X 10.9.1
- appium 0.15.0
- selenium webdriver android-server 2.38.0

## 事前準備
- ruby 2.1.0のインストール
	- [Ruby 2.1.0 install for Mac OSX](https://qiita.com/2or3/items/f52231122c50ffba6b6a)
- node.jsのインストール（npmも一緒にインストールされる体）	
	- [Macにnode.jsインストール](http://qiita.com/2or3/items/9bf7162d31ca2bb18caf)
- Android SDKのインストール
	- [Android Developer page](http://developer.android.com/sdk/index.html)	

## 手順

###appiumをインストール

```bash:appiumインストール&起動
> npm install -g appium
> npm install wd
> appium &
```

### selenium webdriver android-serverの準備
- Androidのデバッグモードを有効にする
	- Android 4.2以上はデフォルトで開発者向けオプションがない
	- 「設定」=>「端末情報」=>「ビルド番号」を７回タップすると「設定」に開発者向けオプションが表示される	
	- 「デバッグモード」をonにする
- AndroidをUSBケーブルでMacにつないで、adbコマンド使えるようにする
	- Driverがなければインストール
	- PATHを通す

```bash:bashrc
$ vim ~/.bashrc
# AndroidSDK
export ANDROID_HOME="/Applications/adt-bundle-mac-x86_64-20131030/sdk/"
export PATH="/usr/local/heroku/bin:/Applications/adt-bundle-mac-x86_64-20131030/sdk/tools:/Applications/adt-bundle-mac-x86_64-20131030/sdk/platform-tools:$PATH"
```

- selenium webdriver android-serverのインストール
	- AndroidをUSBケーブルでつないでおく

```bash:androidDriver
$ wget https://selenium.googlecode.com/files/android-server-2.38.0.apk
$ adb devices
List of devices attached
XXXXXXXXXX    device

$ adb -s XXXXXXXXXX -e install -r /foo/bar/hoge/android-server-2.38.0.apk
4000 KB/s (1591405 bytes in 0.388s)
        pkg: /data/local/tmp/android-server-2.38.0.apk
Success
```

- port forwarding
	- Selenium Webdriverで使用するportをforwardingする

```bash:adb
$ adb -s HT36TS905424 forward tcp:8080 tcp:8080
// ちなみに解除
$ adb -s HT36TS905424 forward --remove tcp:8080
```
 
### Androidの操作をrubyで記述する
- 今回はrubyで使います
	- Java, javascript(node), .Net, php, pythonでもかけます
	- [sample code](https://github.com/appium/appium/tree/master/sample-code/examples)

```bash:appium起動
$ git clone https://github.com/appium/appium.git ~/hogehoge
$ cd ~/hogehoge/appium/sample-code/examples/ruby
$ bundle install
```

- 以下の様な感じでテストをかく
	- 以下のテストは「test」って文言でググる

```ruby:test.rb
require 'test/unit'
require 'selenium-webdriver'

def init()
        driver = Selenium::WebDriver.for(:android)
    driver
end

class SettingsTest < Test::Unit::TestCase
        def setup
        device = `adb devices`
        device_hash = device.delete("\n").match(/\w+\tdevice$/).to_s.gsub(/\tdevice$/, '')
        `adb -s #{device_hash} shell am start -a android.intent.action.MAIN -n org.openqa.selenium.android.app/.MainActivity`
        `adb -s #{device_hash} forward tcp:8080 tcp:8080`
                @driver=init
        end
        def test_settings
        login_site = "http://google.com"
        @driver.navigate.to login_site
        @driver.find_element(:id, "lst-ib").send_keys("test")
        @driver.find_element(:name, "btnG").submit
        sleep 10
        end
        def teardown
                @driver.quit
        end
end
```

- テストを実行

```bash:テスト実行
$ rspec test.rb
```

- とすると、AndroidDriverが立ち上がり、googleにアクセスしてtestという文言で検索されます

## 参照
- [appium](http://appium.io/jp/index.html)
- [selenium webdriver](http://selenium.googlecode.com/svn/trunk/docs/api/rb/frames.html)
- [AppiumでiOSを自動で受け入れテスト Rspecでテストできるよ！](http://konyu.hatenablog.com/entry/2013/06/08/011118)
- [Appiumでモバイルアプリのテストを自動化【概要編】](http://iti.hatenablog.jp/entry/2013/12/25/085726)
- [appiumのインストール](http://appium.io/docs/en/about-appium/getting-started/)