コンユウメモ @kon_yu

作ったガラクタとか、旅行とかの話

AppiumでiOSを自動で受け入れテスト Rspecでテストできるよ!

これは下北沢オープンソースカフェで開かれているiOSの勉強会 iOS部での発表資料を兼ねています。 iOS部のリンクはこちら、https://www.facebook.com/events/578494952182260/

f:id:kon_yu:20130608011042p:plain

Appiumとは

SeleniumIDEベースの Google製のNativeDriver ライクなもの

動作から受け入れテストを自動実行することができる シミュレータと、本体(だったはず)でテストが可能

  • iOSのNativeDriverはiOS4で開発が止まっている

実質 テストで書ける言語は以下

Rubyでテストが書ける!

Rubyでテストが書ける!!!1

Rubyで書く場合は、SeleniumRubyのラッパを踏襲しているようだ

https://code.google.com/p/selenium/wiki/RubyBindings

公式サイト

http://appium.io/

Github

https://github.com/appium/appium

本稿では、インストールの仕方と、サンプルのテストの実施方法を記載する。 あとから分かったことは後半に記す。

インストール

前提

Mac OS X 10.7, but 10.8以上 Xcodeのインストール済みであること node.jsのインストール済みであること ruby1.8以上

appium本体のインストール

> sudo npm install -g appium
> sudo npm install wd

テスト起動

> mkdir appium-test && cd appium-test
> サンプルのテストコードのDL javascriptのテストコード
> curl -O https://raw.github.com/appium/appium/master/sample-code/examples/node/simplest.js
> appium &
> テスト実行、Amazon S3からDLしてコンパイルしてから、テスト実行する
> node simplest.js

Rubyでテストをする場合

> #まずはappiumのgitでcloneする
> git clone https://github.com/appium/appium.git
> #サンプルフォルダへ移動
> appium/sample-code/examples/ruby
> bundle install

javascriptのテストでDLしたアプリを実行する

> sudo find /private/var/ -name TestApp 
> /private/var/folders/sx/ns2sddpd6lb5db8wsf4k70k40000gn/T/TestApp.app/TestApp

実行するアプリケーションのパスが違うので、siple_test.rbの以下を変更する

 # APP_PATH='../../apps/TestApp/build/release-iphonesimulator/TestApp.app'
APP_PATH = '/private/var/folders/sx/ns2sddpd6lb5db8wsf4k70k40000gn/T/TestApp.app'

def absolute_app_path
    #file = File.join(File.dirname(__FILE__), APP_PATH)
    file = APP_PATH
    raise "App doesn't exist #{file}" unless File.exist? file
    file
end

ただ、Rubyのテストコードのサンプルは古いっぽい、もうちょっとラップしたクラスがあるようだ

追記:Rubyでテストできるようにラッパ(ruby_lib)が別リポジトリで展開されているようだ。こちらは動作確認していないが、もっと簡単に書けそう。

要素の取得方式

  • find by "tag name" (i.e., ui component type)
  • find by "name" (i.e., the text, label, or developer-generated * ID a.k.a 'accessibilityIdentifier' of an element)
  • find by "xpath" (i.e., an abstract representation of a path to an element, with certain constraints)

タグ名(種類)、ID名、XPathでも取得できるjQueryでの要素取得できる

アクション

タップ、フリック、スクロール、シェイク

例 スクロール action = @driver.touch.flick(0, 20)

で、何ができる?

文字入力、テキストフィールドの値をチェックできる

actual_sum = @driver.find_elements(:tag_name, 'staticText')[0].text
actual_sum.should eq(expected_sum.to_s)

テキストフィールドにキーボード入力できる

values = [rand(10), rand(10)]
expected_sum = values.reduce(&:+)
elements = @driver.find_elements(:tag_name, 'textField')

elements.each_with_index do |element, index|
  #キー入力はここ
  element.send_keys values[index]
end

アラートの内容を確認できる

a = @driver.switch_to.alert
#ここで比較
a.text.should eq("Cool title")
#OKボタンタップ
a.accept

スクリーンショットが取れる

it "can be saved to the filesystem" do
  #ダダコの書き方は古いっぽい
  @driver.save_screenshot("./pretty_app.png")
end

できそうなテスト

  • 入出力を確認でき、表示内容をチェックすることができる
  • UIViewの大きさをチェックすることができる
  • 文字列の長さとスクリーンショットよりビューからはみ出していないかチェックすることができる
  • 多言語化で文字がはみ出していないかチェックできそう

未確認 * Mobile Safariでテスト * WebViewはテストできるっぽい Hybridアプリ〜という記述から * Androidも同じコードでテストできるらしい

他どんなことに使えそうか、他のテスティングフレームワークとの使い分けを議論出来れば ->iOS部での議論では、あまりテストに関してポジティブな意見がなかった。

出てきた意見

  • モデルだけちゃんとテストしておけばいいじゃないのか?
  • アニメーションは確認できない(できるのか?
  • 似たソフトにKif objective-cで書けるものがある。

Kif参考情報

Kifもよさそうだけど、インテグレーションテストを書くのがQAエンジニアだとしたら、Obj-cとRubyがどっちがいいだろうか?Rubyのほうがシンプルそうだが。 なんといっても俺の好みがRubyなのでテスト書けるのがいいなぁ

今後は、Ruby_libを使った最新版でテストを書いてみようと思う。

Appium参考情報 * http://www.moongift.jp/2013/02/20130218-3/ * http://www.infoq.com/jp/news/2013/05/appium-android