SonarでJUnitのカバレッジを取得

提供: Software Development Memo
移動先: 案内検索
注意 : このページ「SonarでJUnitのカバレッジを取得」は、現在書きかけの状態です。完成版に向けて、今後加筆・修正します。また、本ページの内容は全体的な整合性が取れていない可能性があります。

本ページは、SonarでJUnitのカバレッジを取得する手順を記述します。ビルドツールはAnt、カバレッジツールはCoberturaを使用しています。

Sonarの手順はAnt,Jenkins,Sonarの導入手順を参照してください。

環境

  • OS : CentOS 5.5
  • Jenkins : 1.409
  • Sonar : 2.7
  • Ant : 1.8.2
  • JUnit : 4.8.2
  • Cobertura : 1.9.4.1

導入手順

Sonar測定用Javaプロジェクトの用意

Sonar測定用Javaプロジェクトを作成し、Subversionリポジトリにコミットします。

JUnitのjarを取得

入手先 : http://www.junit.org/

「junit-4.8.2.jar」をJavaプロジェクトの「lib」ディレクトリに保存します。(「lib」ディレクトリは例なので適宜変更しても問題ありません)

hamcrestのjarを取得

入手先 : http://code.google.com/p/hamcrest/

JUnitの動作に必要なhamcrestを取得します。「hamcrest-core-1.3.0RC2.jar」をJavaプロジェクトの「lib」ディレクトリに保存します。


Cobertureのjarを取得

入手先 : http://cobertura.sourceforge.net/

「cobertura-1.9.4.1-bin.zip」をダウンロード後解凍し、「cobertura-1.9.4.1」ディレクトリをJavaプロジェクトの「「lib」ディレクトリに保存します。

build.xml作成

build.xmlファイルの例を以下に記述します。

<?xml version="1.0" encoding="UTF-8"?>
<project name="sample" default="compile" basedir="." xmlns:sonar="antlib:org.sonar.ant">
	<description>Sonarサンプル</description>
	<property environment="env" />
	<property name="src" location="src"/>
	<property name="build" location="bin"/>
	<property name="dist"  location="dist"/>
	<property name="instrument"  location="instrument"/>
	<property name="report"  location="report"/>
	<property name="cobertura" location="lib/cobertura-1.9.4.1"/>

	<taskdef uri="antlib:org.sonar.ant" resource="org/sonar/ant/antlib.xml">
		<classpath path="${env.ANT_HOME}/lib/sonar-ant-task-1.0.jar" />
	</taskdef>

	<path id="cobertura.classpath">
		<fileset dir="${cobertura}">
			<include name="cobertura.jar" />
			<include name="lib/**/*.jar" />
		</fileset>
	</path>

	<taskdef classpathref="cobertura.classpath" resource="tasks.properties" />

	<target name="init">
		<tstamp/>
		<mkdir dir="${build}"/>
	</target>

	<target name="compile" depends="init" description="compile the source">
		<javac srcdir="${src}" destdir="${build}" includeantruntime="false" encoding="UTF-8" debug="true">
			<classpath>
				<pathelement path="lib/junit-4.8.2.jar" />
			</classpath>
		</javac>
	</target>

	<target name="instrument">
		<cobertura-instrument todir="${instrument}">
			<fileset dir="${build}">
				<include name="**/*.class" />
				<exclude name="**/*Test.class" />
			</fileset>
		</cobertura-instrument>
	</target>

	<target name="test">
		<mkdir dir="${report}"/>
		<junit fork="yes" haltonfailure="false">
			<formatter type="xml" />
			<classpath>
				<pathelement location="${instrument}" />
				<pathelement location="${build}" />
				<pathelement path="${cobertura}/cobertura.jar" />
				<pathelement path="lib/junit-4.8.2.jar" />
				<pathelement path="lib/hamcrest-core-1.3.0RC2.jar" />
			</classpath>

			<batchtest todir="${report}">
				<fileset dir="${src}">
					<include name="**/*Test.java" />
				</fileset>
			</batchtest>

		</junit>
	</target>

	<target name="report">
		<cobertura-report format="xml" destdir="${report}" >
			<fileset dir="${src}">
				<include name="**/*.java" />
			</fileset>
		</cobertura-report>
	</target>

	<target name="sonar" description="analyze project" >
		<sonar:sonar workDir="/tmp/sonar/test10" key="com.example.test10:test10" version="0.1">
			<property key="sonar.jdbc.url" value="jdbc:mysql://localhost:3306/sonar?useUnicode=true&amp;characterEncoding=utf8" />
			<property key="sonar.jdbc.driverClassName" value="com.mysql.jdbc.Driver" />
			<property key="sonar.jdbc.username" value="sonar" />
			<property key="sonar.jdbc.password" value="sonar" />
			<property key="sonar.host.url" value="http://<SONAR_HOST_NAME>:8080/sonar" />
			<property key="sonar.sourceEncoding" value="UTF-8" />
			<property key="sonar.java.source" value="1.6" />
			<property key="sonar.java.target" value="1.6" />

			<sources>
				<path location="${src}" />
			</sources>

			<property key="sonar.projectName" value="Sonarサンプル" />
			<property key="sonar.dynamicAnalysis" value="reuseReports" />
			<property key="sonar.cobertura.reportPath" value="${report}/coverage.xml"  />
		</sonar:sonar>
	</target>

	<target name="clean" description="clean up" >
		<delete dir="${build}"/>
		<delete dir="${instrument}"/>
		<delete dir="${report}"/>
		<delete file="cobertura.ser"/>
	</target>
</project>

<SONAR_HOST_NAME>にSoanrが動作しているホスト名を入力してください。

テスト用クラスの名前は「~Test」としていることを前提としています。

Ant書式の参考 :

実行

Jenkinsで新規Jobを作成します。Antのターゲットは「compile instrument test report sonar」とします。

Ant sonar coverage 01.png

JenkinsでJobを実行します。

Ant sonar coverage 02.png

実行後、Sonarのダッシュボードにカバレッジ率が表示されています。

Ant sonar coverage 03.png

Ant sonar coverage 04.png

更新履歴

  • ページ作成 -- 2011年5月5日 (木) 21:25 (JST)