DATE : 2008/10/16 (Thu)
はじめに
Hudson では、Java 以外の言語で作られたプロジェクトの継続的インテグレーションを行うことができます。特に、テスト結果のログを JUnit 形式の XML で出力できる場合、テスト結果の管理もできるので便利です。本記事では、unittest モジュールを用いてユニットテストを行っている Python プロジェクトのテスト結果を Hudson で管理させる方法についてメモします。Python プロジェクトはすでに Hudson に登録できている状態だとします。Hudson でプロジェクトを管理する方法については、「Hudsonを使ったアジャイルな開発入門」(川口耕介、gihyo.jp)を参考にしてください。本記事で使用した Hudson のバージョンは 1.255、Python のバージョンは 2.6 です。
unittest モジュールの結果から、JUnit 形式のログファイルを出力
unittest モジュールは、標準では JUnit 形式のログを出力しません。そこで、Sebastian Rittau 氏が開発された XML Test Runner for PyUnit を使用します。「XML Test Runner」から xmlrunner.py をダウンロードし、プロジェクトのフォルダか <Python のインストールフォルダ>\Lib に配置します。次に、テストを実行するスクリプトを作成します。例えば、test_on_hudson.py というスクリプトに以下のように記述します(「<...>」の部分は、各自のテスト用スクリプトに応じて置き換えてください)。なお、以下のコードは「Hudson embraces Python」(Redsolo)のものを参考にしています。対象とする XML Test Runner for PyUnit は、2007-11-12 版のものです。
import sys import unittest import xmlrunner import <テスト対象モジュール> if __name__ == "__main__": suite = unittest.TestSuite([ unittest.TestLoader().loadTestsFromTestCase(<テストケース>), <その他テストケース> ]) runner = xmlrunner.XMLTestRunner(sys.stdout) runner.run(suite)
テストを実行するスクリプトが出来上がったら、Hudson に登録しておきます。
ビルド手順にユニットテストの起動を指定
プロジェクトページの「設定」→「ビルド手順の追加」から、ユニットテストを起動するスクリプトを実行します。例えば、「Windows バッチコマンドの実行」からユニットテストを起動する場合は、次のようになります。
python <ワークスペースからの test_on_hudson.py のパス> > testlog.xml
「Ant の呼び出し」の場合の Ant スクリプトは、次のようになります。各プロパティは各自のプロジェクトに応じて置き換えてください。hudson.WORKSPACE プロパティは、Hudson から提供される環境変数で、Hudson の上のプロジェクトのワークスペースフォルダを表します。以下の Ant スクリプトでは、ログファイルを <プロジェクトのワークスペース>/logs に「PYUNIT-<ビルドタグ>.xml」という名前で出力します。この Ant スクリプトは、「Ant の呼び出し」→「高度な設定」→「ビルドファイル」にこのファイルのパスを指定するだけで使えます。
<?xml version="1.0" encoding="utf-8"?> <project name="unittestOnHudson" default="test" basedir="."> <description> Python プロジェクトのユニットテストを Hudson 上で実行する。 </description> <property environment="hudson"/> <!-- テスト用コードのパス --> <property name="testCode" location="${hudson.WORKSPACE}/sample/test_on_hudson.py"/> <!-- ログを出力するディレクトリのパス --> <property name="logsDirectory" location="${hudson.WORKSPACE}/logs"/> <!-- ログファイルの名前 --> <property name="logName" value="PYUNIT-${hudson.BUILD_TAG}.xml"/> <target name="test"> <mkdir dir="${logsDirectory}"/> <delete includeemptydirs="true"> <fileset dir="${logsDirectory}" includes="**/*"/> </delete> <exec executable="python" output="${logsDirectory}/${logName}"> <arg path="${testCode}"/> </exec> </target> </project>
あとは、「ビルド後の処理」の「JUnitテスト結果の集計」にチェックを入れ、「テスト結果 XML」に出力されるログファイルのパターンを記述すれば完了です。上記の「Windows バッチコマンドの実行」の場合は、「テスト結果 XML」に「testlog.xml」を、「Ant の呼び出し」の場合は「logs/PYUNIT-*.xml」を指定してください。