DATE : 2010/04/04 (Sun)
subprocessモジュールを使うと、Pythonからコマンドを実行できて便利です。以下のように指定すると、シェルスクリプトも実行できます。
import subprocess
subprocess.call("""
<command1> <argument1 ...>
<command2> <arguemnt2 ...>
""", shell = True)
しかし、シェル組み込みのコマンド(sourceなど)を使用する場合は、executable引数を指定しないと、実行時にエラーとなる可能性があります。executable引数を指定しない場合、subprocessモジュールは、Unix系の環境では/bin/shをシェルとして使用します。
ディストリビューションによって/bin/shにリンクされているシェルが異なります。例えば、Red Hat系ではbashなことが、Debian系ではdashなことが多いようです。
そのため、executable引数にそのシェルのパスを指定しないと、他のディストリビューションにPythonスクリプトを移行した際に急に動かなくなるという現象が起こります(;´Д`)実際に体験しました
先程のスクリプトをexecutable引数を用いたものに書き直すと、次のようになります(以下の例では、bashに依存するスクリプトの場合です)。実際には、ディストリビューションによってシェルの場所も/bin配下にあったり/usr/bin配下にあったりする場合があるので、executable引数に渡す文字列は定数扱いにしておいた方がメンテナンスしやすいかと思います。
import subprocess
BASH = '/bin/bash'
subprocess.call("""
<command1> <argument1 ...>
<command2> <arguemnt2 ...>
""", shell = True, executable = BASH)
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」を指定してください。
