Menu

Category

Archive

logo


fastlaneをセットアップして、ユニットテストの実行とカバレッジ確認

2015-08-22 18:00:00 +0900
  • このエントリーをはてなブックマークに追加

fastlaneという、iOSのデプロイ等の作業を自動化してくれるツールを使用してみました。今回は、fastlaneのセットアップをして、XCTフレームワークのユニットテストの実行、さらにテストコードカバレッジの表示までfastlaneの開発パイプラインに定義して処理をしてみます。

fastlaneのセットアップ

まずは、gemでfastlaneのインストール。

1
$ sudo gem install fastlane --verbose

今回は既存のiOSプロジェクトを使用します。自分のiOSプロジェクトがあるディレクトリの直下に移動して、 fastlaneの初期設定を開始します。

1
2
$ cd [your_project_folder]
$ fastlane init

いくつかの質問に答える必要があります。細かいログは省略しています。ここでは、公式サイトのセットアップガイドに従っています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Do you want to get started? This will move your Deliverfile and Snapfile (if they exist) (y/n)
y

Do you have everything commited in version control? If not please do so! (y/n)
y

App Identifier (com.krausefx.app): your_app_identifer

Your Apple ID (fastlane@krausefx.com): your_apple_id

Do you want to setup 'deliver', which is used to upload app screenshots, app metadata and app updates to the App Store or Apple TestFlight? (y/n)
y

Do you want Deliver to automatically create the Deliverfile for you based on your current app? The app has to be in the App Store to use this feature. (y/n)
y

Do you want to setup 'snapshot', which will help you to automatically take screenshots of your iOS app in all languages/devices? (y/n)
y

Do you want to use 'sigh', which will maintain and download the provisioning profile for your app? (y/n)
y

Optional: The scheme name of your app: (If you don't need one, just hit Enter.)
[just hit Enter]

これでfastlaneのセットアップが完了です。この状態で

1
2
$ cd [your_project_folder]
$ fastlane ios test

でFastfileで定義されているtestレーンが実行されます。 (上記のようにセットアップしていれば、testレーンではsnapshotアクションのみ実行されるはずです。Snapfileにschemeを記述する行があるので、ここに記述すればエラーなしで動きます。) これでfastlaneのセットアップは完了したので、次にユニットテストの実行とテストカバレッジを表示するためにtestレーンに設定していきます。

xctest アクション

xctest アクションを使って、xctestフレームワークを使ったユニットテストを実行する処理をtestレーンに追加してみます。$ fastlane actions で、使用できるアクションの一覧を表示できるので覗いてみるとおもしろいです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Fastfile
desc "Runs all the tests"
  lane :test do
    # snapshot
    xctest(
      scheme: "ShareCla",
      destination: "platform=iOS Simulator,name=iPhone 6,OS=8.4",
      reports: [{
        report: 'html',
        output: './build/reports/xctest/test-report.html',  # will use XCODE_BUILD_PATH/report, if output is not provided
        screenshots: 1
      }]
    )
  end

上記のようにFastfileを編集して、$ fastlane ios test を実行すると、コンソールにテストの結果が表示され、テストのproject_directory/build/reports/xctest/test-report.html にも見やすい形でレポートしてくれます。

テストカバレッジレポート

次にテストコードカバレッジレポートをtestレーンに追加してみます。今回はiOSのテストカバレッジを確認するために2つの方法を試してみました。

gcovr アクション

1つは、gcovr アクションを使用する方法です。

まずは、カバレッジを表示するために必要なファイルを生成するためXcode側でいくつかの設定をする必要があります。

Xcodeで対象となるターゲットを選択し、Debug時に、Instrument Program FlowGenerate Test Coverage FilesGenerate Debug SymbolsYES に設定します。Appleのドキュメントには、このファイル群を生成するために、新しくビルド設定を追加するように推奨されていますが、私はとりあえず、Debug に対して、この3つの設定をしてしまいました。

1
2
3
4
5
6
# Fastfile
gcovr(
  html: true,
  html_details: true,
  output: "./build/reports/gcovr/report.html"
)

このようにFastfileのtestレーンに追記します。この状態で、$ fastlane ios test を実行すると gcovr アクションが実行され、指定したディレクトリにカバレッジレポートのhtmlが存在するはずです。これをブラウザで開けば確認できます。

frankencover.it

今回はもう1つ frankencover.it というツールも使用してみました。こちらも gcovrアクションを使用した時のようにXcodeの設定を忘れずにしてください。

そして下記のコマンドを実行します。

1
2
$ brew install groovy
$ brew install lcov

あとは、このようにコマンドを実行すれば、カバレッジが表示されるはずです。

1
$ groovy http://frankencover.it/with -source-dir ../ShareCla -output-dir ../build/reports/frankencover

fastlaneには現状、frankencover.it用のアクションはないので、上記のコマンドを実行するために、シェルスクリプトを用意します。

1
2
3
4
# ./fastlane/report_code_coverage.sh

#!/bin/sh
$ groovy http://frankencover.it/with -source-dir ../ShareCla -output-dir ../build/reports/frankencover

今回は、上記のシェルスクリプトをfastlaneディレクトリ直下に配置します。 fastlaneは、sh /path/to/script と記述するだけで任意のシェルスクリプトを実行することができます。これをfastlaneディレクトリ直下に入れ、実行権限を付与し、fastlaneコマンドを実行すれば完了です。

1
2
# Fastfile
sh "./report_code_coverage.sh"

これで frankencover.it でもテストコードカバレッジを表示することができました。

参考

fastlane
Technical Q&A QA1514 ~ Configuring Xcode for Code Coverage ~
fastlane/Actions.md at master · KrauseFx/fastlane
frankencover.it