Androidアプリの画面遷移とか簡単な操作を自動でやって、基本動作確認を楽にしよう!
という目論みでRobotiumでテストを書いて、Jenkinsで実行しようとしたら色々とはまったのでメモ。
前提
- JenkinsサーバーはローカルWindowsPC(x64)上にWindowsサービスとして構築
- マトリクスでOS4.0.3と4.2のエミュレーターでテストする
- そして何より俺はJenkins初心者だ!
基本的には、
JenkinsにAndroidアプリのテスト環境を構築する その1 その2
を参考に初心者てきにJenkinsを構築しています。
はまりポイントと作業の流れ
- エミュレーターがNo WindowだとRobotiumが実行出来ないよ!
- Windowありにしたら自PCだと邪魔だから別PCにSlave置いたよ!
- マトリクスが全部Slaveで実行できないよ!
はまりポイントの説明
エミュレーターがNo WindowだとRobotiumが実行出来ないよ!
Robotiumで書いたテストをNo Windowなエミュレーターでテストすると、
junit.framework.AssertionFailedError: Click can not be completed!
at junit.framework.Assert.fail(Assert.java:50)
at junit.framework.Assert.assertTrue(Assert.java:20)
at com.jayway.android.robotium.solo.Clicker.clickOnScreen(Clicker.java:99)
at com.jayway.android.robotium.solo.Clicker.clickOnScreen(Clicker.java:182)
at com.jayway.android.robotium.solo.Clicker.clickOnText(Clicker.java:366)
at com.jayway.android.robotium.solo.Solo.clickOnText(Solo.java:1028)
などと言ってテストがこけました。
最初、実機でテストしたりeclipse+エミュレーターでは上手く行くので困っていたんだけど、
RobotiumのGogoleGroupに以下の投稿が。
Robotium on Linux without video
https://groups.google.com/forum/#!topic/robotium-developers/5WR7IOiAVzM
Windowシステム入ってないLinux上での問題だと思うんだけど、多分これっぽいと思って
「Show emulator window」にチェックを入れて実行したところ無事テストが通るようになりました。
これはUI操作を行うツールだと共通の問題かもしれないです。
(他のツールでJenkins構築したことはないので分からない)
追記
よくよく思い出してみたらこの手順には続きがありました。
WindowsサービスでJenkinsを実行している場合、Windowありのエミュレーターを直接起動できないので、チェックを入れたとしても実行時にエミュレーターの画面が表示されません。
このため、このときの手順としては、まずは同一PC上にSlaveを配置し、Window表示設定にチェックを入れて実行したところ、上手く行くようになりました。
Windowありにしたら自PCだと邪魔だから別PCにSlave置いたよ!
無事にテストが通るようになりましたが、Windowありにしたことによって自動ビルドが走る度にエミュレーター画面が表示されるはめに。。
と言うわけで、ノードに別PCのSlaveを設定することにしました。
SlaveはLAN内の別PCに置くことにして、ちょこっとググってJNLPエージェント経由で接続できるようにしました。
この辺りの設定は詳しくない!
Jenkinsのプロジェクト設定で、
「プロジェクトの高度な設定 -> 実行するノードを制限」で作成したノードを設定したところ、
Slaveを配置したPC上でエミュレーターが起動してテストしているのが確認できました。
マトリクスが全部Slave上で実行できないよ!
無事、自動UIテストが別PC上で実行されるようになったので、マトリクスで4.0.3と4.2のエミュレーターでテストするように設定を行いました。
これが出来ればかなり効率化できるぜしめしめと思っていた矢先、
Jenkinsのコンソール出力を眺めていたら、Slaveで実行されているのが1つのビルドだけだったことに気づきました。
上流プロジェクト"xxxx"の#5が実行
元の原因:
ユーザーxxxxが実行
masterでビルドします。 ワークスペース:xxxx
masterでビルドされてる。。
Jenkinsの設定やconfig.xmlを眺めても他にそれらしい設定とかゴミ設定みたいなものはなくて困っていたところ、、
JenkinsでiOSのビルドを行う時にハマるポイントとその解決法・
の、罠:マルチ構成プロジェクトで実行するノードを制限するに行き当たりました。
こちらに従って、
NodeLabel Parameter Plugin
https://wiki.jenkins-ci.org/display/JENKINS/NodeLabel+Parameter+Plugin
というものを使うと、「ビルドのパラメータ化」という項目が増え、そこにチェックを入れ、
「パラメータの追加」→「Label」 を選択し、Name: LabelSelect
Default Value: <制限したいノードのLabel> など
と言うやつを設定したところ、ようやく複数のビルドがSlaveで実行できるようになりました。
Jenkinsはもう少しちゃんと使いたいので、書籍を読んで出直そうと思ってます。