AppiumでiOSを自動で受け入れテスト Rspecでテストできるよ!
これは下北沢オープンソースカフェで開かれているiOSの勉強会 iOS部での発表資料を兼ねています。 iOS部のリンクはこちら、https://www.facebook.com/events/578494952182260/
Appiumとは
SeleniumIDEベースの Google製のNativeDriver ライクなもの
動作から受け入れテストを自動実行することができる シミュレータと、本体(だったはず)でテストが可能
- iOSのNativeDriverはiOS4で開発が止まっている
実質 テストで書ける言語は以下
Rubyでテストが書ける!
Rubyでテストが書ける!!!1
Rubyで書く場合は、SeleniumのRubyのラッパを踏襲しているようだ
https://code.google.com/p/selenium/wiki/RubyBindings
公式サイト
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)が別リポジトリで展開されているようだ。こちらは動作確認していないが、もっと簡単に書けそう。
- https://github.com/appium/ruby_lib
- https://github.com/appium/ruby_lib/blob/master/lib/appium_lib/driver.rb
- http://rubydoc.info:8080/github/appium/ruby_lib/master/Appium/Driver
要素の取得方式
- 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