Hudson 上でテストを動かそうとしてつまずいた点

テスト環境構築のために、Hudson × Ant × JUnit with Selenium の組み合わせで動かそうとしたら、いろいろと四苦八苦してしまいました…。

JUnit タスクが動かない

なぜか、Ant の JUnitタスクを動かそうとしたら ClassNotFoundException がでました。
不思議なことに、Hudson の設定で「Javaオプション」にクラスパスを追加しても動かなかったです*1


いろいろググったら、クラスパスは Javaオプション欄ではなく、ターゲット欄に「-lib」として設定するのが正しいそうです。
参考:continuous integration - Pass a command line argument to Ant in Hudson - Stack Overflow

どうやら、Javaオプションに設定しても、JUnit タスクで新たに立ち上がるにプロセスには引き継がれず、エラーになるようです。
eclipse 上では意識せずに動いていたので、気づくのに時間がかかりました・・・。

psql(PotgreSQL管理ツール)が動かない

以下のような、psql で初期化SQLを実行する Ant を書いたところ、Hudson 上では動きませんでした。
なぜか、psql が起動したところでピタッと止まり、ログレベルを上げても何も出ない状態に・・・。

<exec executable="${psql.path}/bin/psql.exe">
    <arg value="-f" />
    <arg file="${initialize.sql}" />
    <arg value="${db.name}" />  <!-- データベース名 -->
    <arg value="${db.user}" />    <!-- ユーザ名 -->
</exec>


これの原因は、パスワードの入力待ちでした
なので、パスワードを環境変数に追加して解決*2

    <env key="PGPASSWORD" value="${db.pass}" />    <!-- パスワード -->

ただ、ローカルからのアクセスならパスワードを聞かないように設定してあったので、これは本来不要なはず(現に、eclipse 上では何事もなく動いた)。
Hudson をサービスとして動かしていたからだとは思うんですが・・・詳細はわからずじまいです。

Seleniumが動かない

psql の問題と同様に、Selenium を含んだテストに差し掛かるとピタッと止まりました・・・。
どうやらIEの起動に成功しているものの、表示がされないという状態になったみたいです。
なんとなく、Hudson をサービスで起動してるから?と思ったら・・・ビンゴ。

HudsonからSeleniumのテストを実行する場合、HudsonがWindowsのサービスから起動されていると(Tomcatのサービスにディプロイしている)IEの起動に失敗します。当然という気もしますが。

HudsonからSeleniumを実行する - azuki note

ただ、解決策があるそうです。

しかし、Hudsonのサービスを実行するアカウントをローカルシステムアカウントにして「デスクトップとの対話をサービスに許可」にチェックを入れておけば、IEも起動できてテストを実行することができました。サービスとして実行しているSlaveもOKでした。

Windowsサービスとして動作するHudsonからSeleniumのテストを実行する - azuki note

結局・・・

最終的に、無事テストができる段階までこぎつけました。
eclipse 上ではなんなく動いていたんで、こんなに引っかかるとは思っていませんでした。

でも、動き出してしまえば後は設定いらず、楽にテストができそうです。

*1:これで JUnit 自体は動くようになったものの、今度はテストに必要な jar (JDBCとか) が見つからずにエラーになりました。junit.jar と同じディレクトリに置いたのに・・・

*2:本当は、.pgpassファイルに設定する方がいいそうです。環境変数 - PostgreSQL 9.0.3文書