cisimpleのクラウド環境でiPhoneアプリのテスト自動化を試してみた

Appurifyに買収され 9/1/2013 にサービス終了しました。

cisimpleとは

https://www.cisimple.com/

cisimpleは現在βサービス中のモバイルアプリケーションの開発者を対象としたCIサーバーのサービスです。Travis CIのモバイルネイティブアプリ版のようなものをイメージしてください。

iPhoneアプリのCIサーバーのホスティングサービスがなかなか出てこないのは主にiPhoneアプリのビルドが開発環境をインストールしたMac機器でしか動かないのでビルドサーバーを用意するのに途方もないコストがかかるからなんだろうけど*1、遂に継続的ビルドをサポートするサービスが出てきたのでcisimpleには期待しています。

また丁度同時期にプライベートβがはじまったhostedciというサービスもあります。こちらはiOS, Macのみです。両方試してみているんですがcisimpleのが今のところ完成度が高そうなので先に紹介します*2

https://hosted-ci.com/

クラウド」と書いたけどGoogleAmazonなどからイメージする大規模な分散コンピューティングのイメージは一旦置いておいて、このサービスはどうやらMacの共有ビルドサーバーのマシンをたくさん用意してバックエンドにJenkinsを使ってソリューションを提供しているみたいです。*3

基本的に以下のフローはアカウント以下のデータはすべて公開されているので試す人は機密保持的なデータを上げないよう注意してください

主な特徴

  • iPhoneアプリのビルド・アーカイブ(デバッグシンボルつき)
  • 自動テスト実行(octest)、レポート
  • アプリの受け入れテスト(InstrmentsによるUI Automation)の実行、テストの動画ファイル出力
  • ビルド情報などをcisimple APIで取得できる
  • HockeySDKに対応
  • ビルド時のシェルスクリプトはセキュリティ上の理由から実行できない

料金プラン

有料表は以下です。

pricing - cisimple

最初は14日間のトライアル期間でTeamプランを利用することもできます。

またFreeプランも別にあります。違いは

  • プライベートジョブの数
  • 月のビルド回数
  • ユーザーサポートの内容(ハイグレードプランではCEOが直接電話をくれるそうです)
  • 自動テスト(Instrmentsテスト?)

などです。

ビルド環境スペック

僕のアカウントではこんな感じでした。ログなどから判断

はじめよう

まずサインアップします。先日まで招待登録制できたが今日試したらアカウント作成してすぐ使えました。

DashboardのNew jobからGitリポジトリのURL・ブランチ名を入力して新規ジョブを作成します。

デフォルトでcisimple側が用意したサンプルiPhoneアプリリポジトリGithubに用意されていて先ずはそれで試せます

https://github.com/cisimple-team/cisimple-example-ios

今回は新規にアプリのダミーのプロジェクトをGithub上に作ってみて、それで動作確認をしました。

リポジトリは以下です

https://github.com/laiso/SuperTodo.git

SuperTodoはカッチョイイTodoアプリになる予定のものです。とりあえず今は何の機能もありません。

cisimpleはどうやらGitリポジトリを登録する際に中身のファイル配置をチェックしてくれ、自動でiOSアプリだと判断してくれるようです。

UIがまだ小慣れていませんが設定画面はこんな感じです。以下のような設定ができます

  • 通知
    • Email
    • Webhook
  • ビルドステータスをサイトに埋込むバッジ(Travis-CIなどでも提供しているアレです)
  • スケジューリング
    • ポーリング
    • コミットフック
  • ビルドステップ


そろそろアプリの準備をはじめます、まずテストから書きましょう。

いきなり試しにUIKitとViewに依存したテストコードを書いてみます。

// SuperTodoTests.m

#import <SenTestingKit/SenTestingKit.h>
#import "AppDelegate.h"

@interface SuperTodoTests: SenTestCase
@end

@implementation SuperTodoTests

- (void)testTest
{
  STAssertEquals(1+1, 2, @"1+1=2");
}

- (void)testAppDelegateInstanceIsNotNil
{
  AppDelegate* app = [[UIApplication sharedApplication] delegate];
  STAssertNotNil(app, nil);
}

- (void)testWindowEqualKeyWindow
{
  AppDelegate* app = [[UIApplication sharedApplication] delegate];
  STAssertEquals(app.window, [UIApplication sharedApplication].keyWindow, nil);
}

@end

ローカルでいつもどうりに正常にテストが動作するのを確認したらcisimple上で実行する為にGithubリポジトリにpushします。

cisimpleのジョブ設定を保存し、Star Build ボタンを押すとビルドが実行されます

ログが流れはじめビルドが実行されました

Artifacts にビルド成果ファイルのリンクが追加されています。SuperTodoTests-output.txt をダウンロードして閲覧します。

テストメソッドが実行されパスしているのがわかりました。

UI Automationの受け入れテストも試したい

では、私達のSuperTodoにアプリのユーザーの生産性を上げる為に「タスクの前に寿司」ボタンを配置しましょう。

そしてUI Automationのスクリプトで寿司が出てきたらTodoタクスがうまくこなせるように100回タップします。

var target = UIATarget.localTarget();
var app = target.frontMostApp();
var window = app.mainWindow();
window.buttons()["タスクの前に寿司"].tap();
for(var i=0; i<100;i++){
	window.scrollViews()[0].webViews()[0].images()[0].tapWithOptions({tapOffset:{x:0.29, y:0.60}});
}

テストスクリプトをまたpushして、UI Automation用の新規ジョブをつくります。

のようにリポジトリ内のJavaScriptファイルが抽出されます。このジョブを実行後にはArtifactsにmp4形式でムービーがリンクされています

見事に成功しました。寿司もよろこんでいます*5

おまけ:もっと高く

サンプルはより実践的にがモットーなのでioctcatというGithubクライアントアプリのビルドを実際にcisimple上で動作させてみることにしました。
git submodule update --init のコマンドが必要なんですが、とくに設定も必要なく対応してました。

そのままではビルドすら通らなかったので、cisimpleでビルドできるようにフォークしたブランチを用意しました。

https://github.com/laiso/ioctocat/tree/cisimple

設定がむずかしくまだ自動テストまでうまくいっていませんが成功したらお知らせします。

*1:それでも署名ファイルごと預けてサーバーサイトでバイナリを作るサービスは既にいくつかあった

*2:あと最近出たhttps://saucelabs.com/appium もかなり期待できそうなんですがまだ試せてないです

*3:コンソールログなどから推測

*4:xcprojectでは最新を使うよう設定してあります

*5:革新的コミュニケーションツールをリリースしました - 無知を晒す