Play2.0.4+Jenkins+JUnitでScalaのテストを自働化
こんにちは、even_ekoです。
タイトルが少しややこしくなっています。
今日の記事の内容は、前回(PlayのScalaアプリケーションでテストを実行してみる - きままにものづくり)の続きになっています。
playのscalaアプリケーションをテストするというのが前回の内容でした。
今回は、そのテストをjenkinsで自働化しようということです。テストの結果やコードのカバレッジの結果も出力させちゃいます。
ちなみに、JUnitについて話していきますが、Specs2でも同様にできます。
Jenkinsについて
jenkinsについてはいたるところで詳細に解説されていますが、簡単に言ってしまうと高機能なcronです。
つまり、色んなことを勝手に実行してくれるということです。
jenkinsのインストールと設定はさくらVPS(CentOS6.3)へJenkinsをインストールして認証つけてURLを変更する - えんたつの記録が参考になります。
スクラム開発の環境を整える過程でjenkinsを導入したいというのなら、ALMnium(alminium/alminium · GitHub)を参考にしてみると良いかもしれません。
色んなツールのインストールと設定を自動でしてくれるのでとても便利です。しかし、mysqlのアカウントが既にあるとうまくインストールできなかったりします。その時は、専用のインスタンスを起ち上げたりする必要があるかもしれません。
macにインストールする場合は、[MAC]jenkinsインストール設定 | Memorandum blogが参考になります。
jenkinsの設定
jenkinsをインストールして、アクセスしてみると以下のような画面が出てきます。
写真はmacのローカルにインストールした際のものになります。いくつかジョブがありますが気にしないでください。
設定する内容は以下のようになります。
- JDKの設定
- Gitの設定
- Coberturaのインストール
JDKの設定
「Jenkinsの管理」->「システムの設定」とページを遷移させていくと、JDKの設定できる画面にたどり着けます。
このページのJDKという項目の自動インストールというところにチェックを入れれば勝手に、ビルドする際にインストールしてくれます。写真はインストール後になっているので少し違っています。
Gitの設定
JenkinsはSVNとCVSはデフォルトでサポートしているのですが、Gitはサポートしていません。そのため、プラグインをインストールする必要があります。
プラグインをインストールするページには、「Jenkinsの管理」->「プラグインの管理」でいけます。
利用可能タブをクリックした後、フィルターのところに「Git Plugin」と入力すれば目的のプラグインが出てきます。このプラグインですGit Plugin - Jenkins - Jenkins Wiki
リポジトリの設定などはジョブを作成する際に必要となります。
Coberturaのインストール
Coberturaはカバレッジレポートを作成してくれるプラグインです。antとmavenに対応しています。playはsbtを使用しているので、少し工夫をしないと使用することはできません。
インストールの仕方はgitプラグインと同様です。
少し、余談ですがビルドツールについてまとめておきます。
ant
Apache Ant - Welcome
javaのビルドツール。ビルドのルールをxmlを使用して記述できる。
maven
Maven - Welcome to Apache Maven
javaのプロジェクト管理ツール。antに比べたくさんの機能を持っている。
sbt
sbt — sbt Documentation
scalaとjavaのビルドツール。mavenと比べると機能は少ないがscalaをビルドしてくれる。
playの設定
jenkinsの設定の後は、playのソースに少し変更を加えます。playで作成したアプリケーションのツリー構造は以下のようになっています。
アプリケーションの名前はtreeになっています。若干ややこしいですが...
この中のtree/projectにあるファイルに変更を加えていきます。
** scctの設定
scalaのカバレッジレポートを作成するためにscct(scct - Scala Code Coverage Tool)を使います。
まず初めに、Build.scalaを変更します。
tree/project/Build.scala
import sbt._ import Keys._ import PlayProject._ object ApplicationBuild extends Build { val appName = "tree" val appVersion = "1.0-SNAPSHOT" lazy val s = Defaults.defaultSettings ++ Seq(ScctPlugin.instrumentSettings: _*) val appDependencies = Seq( // Add your project dependencies here, ) val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA, settings=s).settings( // val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA).settings( // Add your own project settings here parallelExecution in test := false ) }
変更箇所は、3つです。
lazy val s = Defaults.defaultSettings ++ Seq(ScctPlugin.instrumentSettings: _*)
ここでは、scctの設定を変数sに保存しています。
val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA, settings=s).settings(
scctの設定をplayのプロジェクトに設定しています。
このスタイルはGetting code coverage in the Play Framework using Jacoco - ronalleva.comを参考にしました。
parallelExecution in test := false
最後に、テストを並列で行われると何かと困る(詳しくはGetting code coverage in the Play Framework using Jacoco - ronalleva.com)ので並列実行しないように設定します。
次に、plugin.sbtを設定します。
tree/project/plugin.sbt
// Comment to get more information during initialization logLevel := Level.Warn // The Typesafe repository resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/" // Use the Play sbt plugin for Play projects addSbtPlugin("play" % "sbt-plugin" % "2.0.4") //追加した部分 resolvers += Classpaths.typesafeResolver resolvers += "scct-github-repository" at "http://mtkopone.github.com/scct/maven-repo" addSbtPlugin("reaktor" %% "sbt-scct" % "0.2-SNAPSHOT")
下の3行が追加した部分になります。
これで、scctの設定は終わりです。
sbt-simple-junit-xml-reporter-pluginの設定
少し名前が長いですが、sbt-simple-junit-xml-reporter-pluginはJUnitのxmlレポートをsbtでも吐き出させるようにするプラグインです。
githubで公開されています(https://github.com/bseibel/sbt-simple-junit-xml-reporter-plugin)
sbtはmavenと違いレポートを吐き出す機能をデフォルトでは備えていないため、これが必要になります。
ちなみに、specsの場合はspecs側でそのような設定になっているのでプラグインは必要ありません。
scalaTestもそのような機能を含んでいるらしいです(Google グループ)。
しかし、playがサポートしているテスト・ツールはJUnitとspecsです。なので、scalaのテストをJUnitで行う場合は、このようなプラグインが必要になります。
sbt-simple-junit-xml-reporter-pluginの設定では、新しくplugin.scalaというファイルを作成します。
tree/project/plugin.scala
import sbt._ object Plugins extends Build { lazy val plugins = Project("plugins", file(".")) .dependsOn( uri("git://github.com/bseibel/sbt-simple-junit-xml-reporter-plugin.git") ) }
gitにpushする
jenkinsにはgitリポジトリからソースをcloneするように設定するので、どこかのリポジトリに変更を加えたplayのソースをpushして下さい。
今までのもろもろの設定が面倒くさい、もしくはgitリポジトリなんてないという方は私のgithubにテスト用のソースを上げているのでそちらを使用してみて下さい。
https://github.com/iseki-masaya/playTestWithJUnit
Jenkinsのジョブを作成する
jenkinsのジョブを作成します。homeの画面の「新規ジョブ作成」から作成できます。
ジョブ名を記入後、フリースタイル・プロジェクトのビルドを選択して下さい。
ソースコード管理システムのところでGitを選択し、リポジトリのURLを入力して下さい。
次に、ビルドの項目でシェルの実行を選択し、以下のソースを記入して下さい。
rm -rf ./test-reports/*.xml play clean play test play scct:test
最初のrm -rf ./test-reports/*.xmlは、sbt-simple-junit-xml-reporter-pluginにより作成されるレポートを削除するためのコマンドです。
本当はAPP_ROOT/target/test-reportsのところにxmlを吐いて欲しいのですが、設定の方法が分からないのでこうなっています。
次に、ビルド後の処理の項目で、Cobertura カバレッジレポートの作成を選択します。
Cobertura XML レポートパターンのところにscctによって出力される結果のパスを入力します。
**/target/scala-2.9.1/coverage-report/cobertura.xml
最後に、ビルド後の処理の追加を押し、JUnitテストの結果の集計を選択します。
sbt-simple-junit-xml-reporter-pluginによって出力される結果のパスを入力します。
**/test-reports/*.xml
これで、保存を押します。
この状態で、ビルドの実行を押して結果を確認します。
以上で自働化完了です。