メモの日々


2012年03月12日(月) [長年日記]

[java] JenkinsにNetBeansのbuild.xml用のJUnitのjarファイルを指定する

NetBeansがプロジェクト用に生成するbuild.xmlのtestターゲットをJenkinsで実行しようとしたら、JUnitのクラスを見つけられなくてエラーになってしまった。NetBeansのバージョンは7.0.1(ちょっと古い)だけど、build.xmlを生成したのはもっと前のバージョンかもしれない。

検索すると ANT_HOME/lib にjunit.jarを置けばうまくいきそうなんだけど、手元ではこうしても結果は変わらなかった。

build.xmlがimportしているbuild-impl.xmlを一生懸命読んだ所、nbproject/project.properties ファイル内で libs.junit_4.classpath というプロパティをテスト時のクラスパスに設定していることが分かった。

なので、Jenkinsのジョブの設定画面の「ビルド」の「Antの呼び出し」の「高度な設定」の「プロパティ」欄に「libs.junit_4.classpath=junit.jarのフルパス」のように書いたらうまくいくようになった。

[java] NetBeansのbuild.xmlを使うとテスト失敗時にJenkinsの結果が赤になる

Jenkins上でJUnitが動くようになったけど、テストが1つでも失敗すると結果がfailed(赤)になってしまう。このケースではunstable(黄)になって欲しい。再びbuild-impl.xmlを読む。やれやれ。

testターゲットでは、j2seproject3:junit というタスクが使われていていた。このタスクの実体は、同ファイルの-init-macrodef-junitターゲットに定義されている。該当箇所の最初だけ引用:

    <target name="-init-macrodef-junit">
        <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
            <attribute default="${includes}" name="includes"/>
            <attribute default="${excludes}" name="excludes"/>
            <attribute default="**" name="testincludes"/>
            <sequential>
                <property name="junit.forkmode" value="perTest"/>
                <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">

最後の行の「errorproperty="tests.failed" failureproperty="tests.failed" 」で、テストがエラーまたは失敗するとtests.failedというプロパティがtrueになるようにしているようだ。エラーと失敗を区別しないのか。

そして、別の箇所に

    <target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
        <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
    </target>

とあって、tests.faildがtrueだとfailタスクでAntをエラー終了させていた。この部分を見ると、ignore.failing.testsというプロパティがtrueの場合はfailタスクが動かないようなので、上のlibs.junit_4.classpathと同じようにしてJenkinsの設定に

ignore.failing.tests=true

を追記したら、テストが失敗したときに赤ではなく黄色になるようにできた。