My Octopress Blog

A blogging framework for hackers.

Yeomanで作ったIonic+AngularJS+PhoneGapなWebアプリのKarma+mocha+chaiなテストをJenkinsで実行するよ!

タイトルの通り、Yeomanで作ったIonic+AngularJSなWebアプリをPhoneGapでネイティブアプリにするプロジェクトを構築し、 テストをmocha+chaiで記述してKarmaで実行できるようにし、Jenkinsで定期ジョブにする手順を記述するエントリです。

登場人物が多すぎて自分でも意味不明になってきたので、整理の意味でブログに書いときます。

用語

まずは上述の用語の乱雑なまとめ

Yeoman

アプリケーションのひな形を作成してくれるツール

grunt

ビルドツール

bower

javascriptライブラリの管理ツール

npm

node.jsライブラリの管理ツール

まだ使い始めたばかりなのでアレですが、Yeoman+grunt+bower+npmでJavaのMavenみたいなことが出来るという 理解でいいのかな。便利っぽいです。

Ionic

AngularJSに依存したモバイルWebアプリのUIライブラリ。 Phonegapでの利用も想定して作られているようなので、使ってみました。 AngularJSはただのWebアプリ用のフレームワークなので、モバイル端末に対応するためには 何らかのUIライブラリが必要です。

AngularJS

有名なJavascript MVCフレームワークです

Karma

テストランナーです

mocha

テストフレームワークです

chai

アサーションライブラリです

Javascriptだとテスト関係のライブラリが機能別に細かく分かれているのでややこしいですね。

PhoneGap

WebアプリをWebView上でで動くネイティブアプリにするライブラリ。 ハードウェア機能もJavascriptで使えるインターフェイスが用意されていてクロスプラットフォームなアプリを作れる

開発環境の構築

概念はややこしいですが、手順がワークフロー化されているので、やることは簡単です。

まずは一連の操作で利用するライブラリをインストールしましょう。rubyとかgemとかnpmとかはすでに入っているかんじで、

# gem install compass
# npm install -g bower grunt-cli yo yeoman-generator generator-ionicjs karma-junit-reporter
# npm install -g phonegap cordova

続いて、実際のプロジェクトを作成していきます。

$ mkdir ionicSample
$ cd ionicSample
$ yo ionicjs

    _             _
   (_)           (_)
    _  ___  _ __  _  ___
   | |/ _ \| '_ \| |/ __|
   | | (_) | | | | | (__
   |_|\___/|_| |_|_|\___|

[?] Would you like to use Sass with Compass (requires Ruby)? (y/N) y
Created a new Cordova project with name "IonicSample" and id "com.example.IonicSample"
[?] Which Cordova plugins would you like to include? (Press <space> to select)
‣⬢ org.apache.cordova.console
 ⬢ org.apache.cordova.device
 ⬡ org.apache.cordova.network-information
 ⬡ org.apache.cordova.splashscreen
 ⬡ org.apache.cordova.battery-status
 ⬡ org.apache.cordova.statusbar
 ⬡ org.apache.cordova.device-motion
[?] Which Cordova plugins would you like to include? org.apache.cordova.console, org.apache.cordova.device
[?] Which starter app template which you like to use? 
  Blank 
  Tabs 
  Side Menu 
‣ Pets Seed 

まず、Compassを使うかどうか、つづいてインポートするphonegapライブラリの選択を行います。 最後にひな形の種類を聞かれます。実際に開発する場合は余計なものが無い方がいいかもしれませんが、 ここではあるていどコンテンツが用意されているPet Seedを選択します。

パッケージビルドするプラットフォームを追加します。ここではandroidを扱います。 あ、AndroidSDKはすでに適当に入ってる感じでおねがいします。

$ cordova platform add android

ビルドします。

$ grunt build

これでもう、./platforms/android/ant-build に動作可能なパッケージができました。マジお手軽。

それでは、実行してみましょう。テスト用の端末をUSB接続するか、エミュレータを立ちあげておいて、

$ cordova run android

実行出来ましたか?実行出来ましたね。

テスト

単体テストを実行します。テストはすでに ./test/spec/ 以下にサンプルがありますので、これを実行します。 karmaといえば、ファイルの変更を検知して実行してくれる監視機能が特長のようですが、 ここでは、最終的にはJenkinsのジョブとして扱いたいので、コマンドライン実行します。

とはいえ、すでにすべての準備は整っていて、

$ grunt karma:continuous

Running "karma:continuous" (karma) task
WARN [karma]: Port 8080 in use
INFO [karma]: Karma v0.12.2 server started at http://localhost:8081/
INFO [launcher]: Starting browser PhantomJS
WARN [watcher]: Pattern "/path/to/ionicSample/test/mock/**/*.js" does not match any file.
INFO [PhantomJS 1.9.7 (Linux)]: Connected on socket jd_w9g872hnwnSfMdscZ with id 60562257
.
PhantomJS 1.9.7 (Linux): Executed 1 of 1 SUCCESS (0.039 secs / 0.001 secs)

=============================== Coverage summary ===============================
Statements   : 81.82% ( 9/11 )
Branches     : 100% ( 0/0 )
Functions    : 66.67% ( 4/6 )
Lines        : 81.82% ( 9/11 )
================================================================================

Done, without errors.


Execution Time (2014-04-01 08:45:17 UTC)
karma:continuous  1.6s  ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 100%
Total 1.6s

できました。いたれり尽くせりすぎて怖い。

ちなみに、karmaの監視を開始する場合は grunt test とやってください。

テストのコマンドライン実行はできましたが、jenkinsにジョブ登録してテストの定期実行結果を評価するには テスト結果をファイル出力する必要があります。

JUnit形式Reporterの追加

$ npm install karma-junit-reporter --save-dev

Gruntfile の、karma.options.reporters を修正します

$ vi Gruntfile.js
reporters: ['junit', 'dots', 'coverage'],   #<- 'junit'を追加

再度テスト実行

$ grunt karma:continuous

JUnit形式の結果ファイル test-results.xml ができていると思います。

Jenkinsには、このテスト実行コマンドと結果ファイルを登録しておけば継続的インテグレーションができるようになります。