2014年4月2日水曜日

iOSテストフレームワークKIFで大ハマリ

カード決済会社Squareが開発・提供しているオープンソースのiOS用テストフレームワーク、KIFについて。

■これは良い物だ■

わりと余裕のある開発案件を担当中なので今度こそTDD…とは言わないまでもユニットテストばりばりに活用してテスト負担を下げてやろうじゃん、と思いまして。

ググったところ、60分で始めるiOSアプリのUI自動テストという記事がトップに出てきました。既存のテストフレームワークやInstrumentsのUI Automationよりもかなり直感的かつラクにテストが出来そうです。

というわけで、さっそく試してみたのですが…。

先に結論を書くと、GUI要素を拾うのにAccessibility Labelを使っているのでNavigation Bar / Tab Barなどに対応するのが面倒くさい(座標でタップ位置を指定する必要がある)のと、フレームワークが非公開APIを使っているということで断念しました。

本体に非公開API使っていなければrejectされることはないと思いますが、ある日突然テストを使えなくなるのは避けたいし、納品物としては法的リスクには近寄れません。

■でも一応インストール方法など■

GitHubのKIFのページにインストール方法が書いてありますが、残念ながらXcode5とは微妙に違っていてハマりまくりました。ということで、まとめておきます。

まずKIFを動かすのに必要なものは以下の通り:

  • Xcode command line tools(Xcode5は標準で入ってる?)
  • Cocoa Pods

CocoaPodsでなくてもGitHubからFrameworkを手動でインストールできますが、ラクなのでこの機会にインストールした方が良いと思います。ということで、CocoaPodsが入っていることを前提として以下手順です。

  1. 新しくtest targetを追加します。
    XcodeでFile->New...->Target、iOS other、Cocoa Touch Unit Testing Bundleを選び、Next。Product Nameはお好きな名前(Testだとわかるものが良いです)、Typeとして「OCUnit」を選びます。OCUnitはDeprecatedになっているかもしれませんが、問題ないっす。FinishボタンでTest Targetが追加されます。
  2. Terminal.appを起動します。
    もしエンコードがUTF-8以外だったら、UTF-8に変更して新しいウィンドウを開きます。これハマりネタです。podを実行した時にワーニングが出るのですが「どうせ使ってないから関係ないだろ」と無視していたら、これが原因でターゲットが認識されずに30分ほど悩みました。
  3. プロジェクトのルートディレクトリにPodfileというファイル名で下記の様なテキストを作ります。ここでTargetには上で作ったProduct Nameを指定します。もちろんお好みのエディタを使って結構ですが、エンコーディングがUTF-8になっていることをくれぐれもご確認ください。

    #Podfile
    target 'ターゲット名', :exclusive => true do
        pod 'KIF', '~> 2.0'
    end

  4. ターミナルでプロジェクトディレクトリへ移動し、pod installを実行します。正常終了のメッセージが出れば、プロジェクトが出来上がりました。
  5. 一度Xcodeを終了します。
  6. プロジェクト・ディレクトリの中を見ると、<プロジェクト名>.xcworkspaceができていると思いますので、これをダブルクリックするとXcodeが起動します。
  7. ワークスペースの中のPodsをbuildします。

あとは、前記「60分で始めるiOSアプリのUI自動テスト」の「KIFの使い方」にある通りでばっちりです。

なお、私はLabelとAccessibility Labelを間違えて、「ボタンが認識されないなー」地獄で15分ほど溺れておりました。皆さんがハマらないようお祈りしております。